Propojení modelů netextově

18 views
Skip to first unread message

PavelZet

unread,
Feb 5, 2018, 2:42:56 PM2/5/18
to django-cs
V Djangu se velice hezky vytvářejí mocné modely.

Proč se ale napojení na tyto modely často provádí textově?

Například administraci svážu s modelem takovouto textovou formou
class HumanAdmin(admin.ModelAdmin):
    list_display
= ('name', 'surname', 'birth_date', 'sex') # textové vazby
    list_filter
= ('sex') # textové vazby
    search_fields
= ['name', 'surname'] # textové vazby

Nebo formulář svážu s modelem opět textem
class HumanForm(forms.ModelForm):
    name
= forms.CharField()
    surname
= forms.CharField()
    birth_date
= forms.DateField()
    sex
= forms.BooleanField()

   
class Meta:
        model
= Human
        fields
= ('name', 'surname', 'birth_date', 'sex') # textové vazby

Přináší to problémy:
- možnost překlepu v názvech bez syntaktické kontroly
- vznik chyby při přejmenování modelu nebo jeho atributu
- IDE nenapovídá
- opakovaný řetězec na více místech se špatně udržuje

Nelze propojení řešit nějakým sofirtikovanějším způsobem, ve smyslu ?
fields = (Human.name.__name__, Human.surname.__name__, Human.birth_date.__name__, Human.sex.__name__)
Problém je, že proměnná nemá atribut __name__ (jako má třeba funkce)

Případně mě napadá, že by model musel obsahovat konstanty s názvy atributů, např.
classHuman(models.Model):
    name = models.TextField()
    surname = 
models.TextField()
    birth_date = models.DateField()
    sex = models.BooleanField()

    NAME = "name"
    SURNAME = "surname"
    BIRTH_DATE = "birth_date"
    SEX = "sex"

Řetězce jsou alespoň pohromadě a na jednom místě. Pro případné úpravy do budoucna lépe uchopitelné.
Poté by šlo používat takto:
fields = (Human.NAME, Human.SURNAME, Human.BIRTH_DATE, Human.SEX)

Ale není to DRY a nikde sem to neviděl :( tak jsem na pochybách.

Proto se chci zeptat:
1. Proč se používají řetězce jako odkazy na atributy tříd ?
2. Používá se nějaký sofistikovaný způsob ?

Díky za reakce.

Honza Král

unread,
Feb 5, 2018, 3:21:12 PM2/5/18
to djan...@googlegroups.com
2018-02-05 20:37 GMT+01:00 PavelZet <zeh...@gmail.com>:
> V Djangu se velice hezky vytvářejí mocné modely.
>

> Proč se ale napojení na tyto modely často provádí textově?

z ruznych duvodu, viz nize....

> Například administraci svážu s modelem takovouto textovou formou
> class HumanAdmin(admin.ModelAdmin):
> list_display = ('name', 'surname', 'birth_date', 'sex') # textové vazby
> list_filter = ('sex') # textové vazby
> search_fields = ['name', 'surname'] # textové vazby

V tuto chvili HumanAdmin neni svazany s modelem a tedy jine vazby
delat nejdou - takovy HumanAdmin muze byt svazan s ruznymi modely
ktere maji stejne pojmenovane sloupce napriklad

>
> Nebo formulář svážu s modelem opět textem
> class HumanForm(forms.ModelForm):
> name = forms.CharField()
> surname = forms.CharField()
> birth_date = forms.DateField()
> sex = forms.BooleanField()
>
> class Meta:
> model = Human
> fields = ('name', 'surname', 'birth_date', 'sex') # textové vazby

Pole fields muzu mit napriklad z konfig souboru, ci jineho mista

>
> Přináší to problémy:
> - možnost překlepu v názvech bez syntaktické kontroly

Tahle chyba se projevi pri prvnim spusteni testu a nebo dokonce pri
importu toho modulu

> - vznik chyby při přejmenování modelu nebo jeho atributu

Opet by to melo byt pokryto testy

> - IDE nenapovídá

Mne IDE (vim) napovida kazde slovo, ktere se objevuje nekde v
projektu, chapu ze to neni pro kazdeho a nekdo je zvykly na chytrou
napovedu

> - opakovaný řetězec na více místech se špatně udržuje

ano, s tim souhlasim, ale kdyz rekneme A, musime rict i B - bez toho
retezce by muselo byt vice kodu (importy, pristupy na promenne atp) a
tak se, dle mych zkusenosti, moznost chybi nezmensi

>
> Nelze propojení řešit nějakým sofirtikovanějším způsobem, ve smyslu ?
> fields = (Human.name.__name__, Human.surname.__name__,
> Human.birth_date.__name__, Human.sex.__name__)
> Problém je, že proměnná nemá atribut __name__ (jako má třeba funkce)

Fields jsou v Djangu ulozene v _meta atributu jako dictionary, k
pristupu k nim muzu pouzit but list a/nebo musim mit jejich jmeno v
retezci, opet neni primy pristup pres identifikator :)

>
> Případně mě napadá, že by model musel obsahovat konstanty s názvy atributů,
> např.
> classHuman(models.Model):
> name = models.TextField()
> surname = models.TextField()
> birth_date = models.DateField()
> sex = models.BooleanField()
>
> NAME = "name"
> SURNAME = "surname"
> BIRTH_DATE = "birth_date"
> SEX = "sex"
>
> Řetězce jsou alespoň pohromadě a na jednom místě. Pro případné úpravy do
> budoucna lépe uchopitelné.
> Poté by šlo používat takto:
> fields = (Human.NAME, Human.SURNAME, Human.BIRTH_DATE, Human.SEX)
>
> Ale není to DRY a nikde sem to neviděl :( tak jsem na pochybách.
>
> Proto se chci zeptat:
> 1. Proč se používají řetězce jako odkazy na atributy tříd ?

je to jednodussi

> 2. Používá se nějaký sofistikovaný způsob ?

ne :)

Obecne v Pythonu (a casto i jinych dynamickych jazycich) se casto
pouziva string misto identifikatoru, je to snazsi, usetri to importy a
je to flexibilnejsi (muzu ten seznam dostat treba z konfiguracniho
souboru). Ve finale ti pouzivani identifikatoru (a tedy pomoc IDE a
kompilatoru) zas tolik veci neusnadni jelikoz kod stejne musis pustit
(pomoci testu!) abys overil jeho spravnost a v takovem pripade se vzdy
pripadna chyba projevi.

Je to proste jiny pristup. Ono koneckoncu ani pouziti identifikatoru
by ti nedalo potrebnou jistotu protoze, pokud kod neni top-level v
modulu, bys na chybu prisel az pri pusteni kodu, stejne jako ted..

>
> Díky za reakce.

Snad jsem na neco odpovedel.
>
> --
> --
> E-mailová skupina djan...@googlegroups.com
> Správa: http://groups.google.cz/group/django-cs
> ---
> Tuto zprávu jste obdrželi, protože jste přihlášeni k odběru skupiny
> „django-cs“ ve Skupinách Google.
> Chcete-li zrušit odběr skupiny a přestat dostávat e-maily ze skupiny,
> zašlete e-mail na adresu django-cs+...@googlegroups.com.
> Chcete-li tuto diskusi zobrazit na webu, navštivte
> https://groups.google.com/d/msgid/django-cs/929d65b7-d89f-4237-90c7-a7bf7d4d5188%40googlegroups.com.
> Další možnosti najdete na https://groups.google.com/d/optout.
Reply all
Reply to author
Forward
0 new messages