2018-02-05 20:37 GMT+01:00 PavelZet <[email protected]>:
> 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 [email protected]
> 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 [email protected].
> 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.

-- 
-- 
E-mailová skupina [email protected]
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 [email protected].
Chcete-li zobrazit tuto diskusi na webu, navštivte 
https://groups.google.com/d/msgid/django-cs/CADoCwr0vHfQvUqqOsFt1piFwq9U%3DQE81djc_ixaOt0veR79Y%2Bw%40mail.gmail.com.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

Reply via email to