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.