Ahoj, chci se zeptat, zda1) opravdu všichni pro výběr dat z databáze používáte Django ORM ?
2) jak lze určit zda použít INNER nebo OUTER JOIN ?
3) když chci vyhledat entitu s posledním ID, tak nejlepší volbou je formaSELECT ... WHERE id = max(id)jak ji dosáhnu?zkoušel sem .filter(id=Max(id)), který ale použije pomalejší HAVING místo optimálního WHERESELECT ... HAVING id = max(id)
4) proč všichni používají zápis .latest() (resp. .order_by(id)[:1].get()), který srovná celou tabulku a vybere poslední prvek formouSELECT ... ORDER BY id DESC LIMIT 1což je pomalejší a obecně o něco horší možnost ?
5) existuje nějaký dobrý tutoriál z pohledu SQL, kde jasně uvidím jak psát ORM formu, abych dosáhl konkrétního SQL ?
6) napíšu v ORM obecně jakkoli zamotaný SQL dotaz? nebo sou věci které prostě nejdou?
7) jsou případy na které se Django ORM vyloženě nehodí a musí se použít náhradní řešení ?
Jsem zvyklý si optimalizované SQL dotazy psát sám. Samotný dotaz mám napsaný rychle.Nevýhoda byla, že musím myslet na escapování vstupů a poté musím mapovat výsledné pole na entitu. Toho bych se rád z časových důvodů zbavil.Na to se hodí ORM.
V ORM řešení mám vše napsané rychle a funkčně, to je fajn a jeví se dobře.ALE poté musím dotazy ještě debugovat, googlit a editovat tak, aby vznikl optimální SQL dotaz, jaký si představuju. Takže časová úspora je zase tatam :(
--Díky za reakce znalých.
--
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/879de872-c7c6-4aad-b00f-d9a9a58f6ae9%40googlegroups.com.
Další možnosti najdete na https://groups.google.com/d/optout.
--
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CA%2BL8erbnznv5YrMu4i5O4pis5O79LAEKQQ-shhEVYT9Vahgt4w%40mail.gmail.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CAK-vJUmm29xjoSQ%2B9FP0J2jf9sbB%3Dm1OtMAqQvYss1rTbbXT%2BQ%40mail.gmail.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CA%2B7MNVqWmqXnG%3DheoaZdhEj_CAprhJqVBLQ4J%2Bh%2BQoUMiVg28w%40mail.gmail.com.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/658d3e32-db3d-4a8c-9929-37f852865b85%40googlegroups.com.
1) opravdu všichni pro výběr dat z databáze používáte Django ORM ?
SELECT ... ORDER BY id DESC LIMIT 1
což je pomalejší a obecně o něco horší možnost ?
Nevýhoda byla, že musím myslet na escapování vstupů a poté musím mapovat výsledné pole na entitu. Toho bych se rád z časových důvodů zbavil.
Ahoj, chci se zeptat, zda
SELECT ... WHERE id = max(id)jak ji dosáhnu?zkoušel sem .filter(id=Max(id)), který ale použije pomalejší HAVING místo optimálního WHERESELECT ... HAVING id = max(id)4) proč všichni používají zápis .latest() (resp. .order_by(id)[:1].get()), který srovná celou tabulku a vybere poslední prvek formouSELECT ... ORDER BY id DESC LIMIT 1což je pomalejší a obecně o něco horší možnost ?5) existuje nějaký dobrý tutoriál z pohledu SQL, kde jasně uvidím jak psát ORM formu, abych dosáhl konkrétního SQL ?6) napíšu v ORM obecně jakkoli zamotaný SQL dotaz? nebo sou věci které prostě nejdou?7) jsou případy na které se Django ORM vyloženě nehodí a musí se použít náhradní řešení ?Jsem zvyklý si optimalizované SQL dotazy psát sám. Samotný dotaz mám napsaný rychle.Nevýhoda byla, že musím myslet na escapování vstupů a poté musím mapovat výsledné pole na entitu. Toho bych se rád z časových důvodů zbavil.Na to se hodí ORM.V ORM řešení mám vše napsané rychle a funkčně, to je fajn a jeví se dobře.ALE poté musím dotazy ještě debugovat, googlit a editovat tak, aby vznikl optimální SQL dotaz, jaký si představuju. Takže časová úspora je zase tatam :(Díky za reakce znalých.
--
Ahoj,1) opravdu všichni pro výběr dat z databáze používáte Django ORM ?já teda nejsem Djangista, ale co jsem tak vypozoroval, tak Django ORM je základní abstrakce pro data store a business logiku, díky tomu funguje integrace s pluginy, adminem a tak. Když vezmeš Django a odečteš ORM a cokoliv, co na ORM nějak navazuje, tak ti zbyde Flask :) Takže potom by vlastně Django nedávalo žádnou přidanou hodnotu a z toho bych usoudil, že 99,9% Django vývojářů bude používat ORM :)
Ahoj,1) opravdu všichni pro výběr dat z databáze používáte Django ORM ?já teda nejsem Djangista, ale co jsem tak vypozoroval, tak Django ORM je základní abstrakce pro data store a business logiku, díky tomu funguje integrace s pluginy, adminem a tak. Když vezmeš Django a odečteš ORM a cokoliv, co na ORM nějak navazuje, tak ti zbyde Flask :) Takže potom by vlastně Django nedávalo žádnou přidanou hodnotu a z toho bych usoudil, že 99,9% Django vývojářů bude používat ORM :)
V kontextu tohohle je psaní vlastních SQL příkazů asi něco jako programovat v C, když můžu to samé naprogramovat v Pythonu. Ale i to je někdy potřeba.SELECT ... ORDER BY id DESC LIMIT 1
což je pomalejší a obecně o něco horší možnost ?Z čeho tak usuzuješ? Nevím o ničem rychlejším, než vlézt do id indexu, podívat se na poslední prvek (předpokládám, že ten index je seřazený), a fetchnout záznam, na který ten poslední prvek odkazuje. Nebo aspoň to si představuju, že SQL databáze udělá. Aspoň teda NoSQL databáze to tak dělají :)
SELECT terms.*, termslang.*
FROM terms
LEFT JOIN termslang ON (terms.id = termslang.terms_id)
WHERE terms.enable=1 AND termslang.lang=1
ORDER by terms.id DESC
LIMIT 1LANG_CHOICES = {
'cs': (1, _('cs')),
'en': (2, _('en')),
}
ENABLE_CHOICES = (
(0, _('enabled')),
(1, _('disabled')),
)
class TermsLang(models.Model):
""" Terms translation """
terms = models.ForeignKey('Terms', verbose_name=_('terms of use'), on_delete=models.SET_NULL, null=True)
lang = models.PositiveSmallIntegerField(verbose_name=_('lang'), choices=LANG_CHOICES.values(), db_index=True)
source_html = RichTextField(verbose_name=_('terms source'), blank=True)
create_time = models.DateTimeField(_('create time'), auto_now_add=True)
update_time = models.DateTimeField(_('update time'), auto_now=True, null=True)
class Meta:
verbose_name = _('Localized terms of use')
verbose_name_plural = _('Localized terms of use')
unique_together = ('terms', 'lang')
class Terms(models.Model):
""" Terms of use """
enable = models.PositiveSmallIntegerField(verbose_name=_('enable'), choices=ENABLE_CHOICES, db_index=True)
version = models.CharField(_('version'), max_length=20)
create_time = models.DateTimeField(_('create time'), auto_now_add=True)
update_time = models.DateTimeField(_('update time'), auto_now=True, null=True)
class Meta:
verbose_name = _('Terms of use')
verbose_name_plural = _('Terms of use')def terms(request):
try:
terms_entity = models.Terms.objects.filter(enable=1).latest('id')
terms_id = terms_entity.id
terms_lang_entity = models.TermsLang.objects.filter(terms_id=terms_id, lang=1).get()
terms_html = terms_lang_entity.source_html
except (models.Terms.DoesNotExist, models.TermsLang.DoesNotExist):
terms_html = ""
return render(request, 'terms.html', {'terms_html': terms_html})def terms(request):
try:
terms_lang_entity = models.TermsLang.objects.select_related('terms').filter(lang=1, terms__enable=1).latest('terms__id')
terms_html = terms_lang_entity.source_html
except models.TermsLang.DoesNotExist:
terms_html = ""
return render(request, 'terms.html', {'terms_html': terms_html})def terms(request):
terms_entity = models.Terms.objects.select_related('termslang').filter(enable=1, termslang__lang=1).latest('id')
terms_html = terms_entity.termslang.source_html
return render(request, 'terms.html', {'terms_html': terms_html})
Dne středa 15. srpna 2018 10:22:23 UTC+2 Messa napsal(a):Ahoj,1) opravdu všichni pro výběr dat z databáze používáte Django ORM ?já teda nejsem Djangista, ale co jsem tak vypozoroval, tak Django ORM je základní abstrakce pro data store a business logiku, díky tomu funguje integrace s pluginy, adminem a tak. Když vezmeš Django a odečteš ORM a cokoliv, co na ORM nějak navazuje, tak ti zbyde Flask :) Takže potom by vlastně Django nedávalo žádnou přidanou hodnotu a z toho bych usoudil, že 99,9% Django vývojářů bude používat ORM :)Django ORM má zastat funkce dolování dat a business? Takže nemá smysl psát další vrstvy jako repository (dolování dat) a service (business logika) ? Veškerá logika má tedy být v jednom dlouhém view (pro každý modul)?Asi bych i tak tyto vrstvy (repository a service) zachoval. Přijde mi přehlednější když views pouze zpracuje request a pak zavolá service. Views se tak dost zúží.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/7bfcc970-d0b3-418e-8ac5-73a7d2c9d3e0%40googlegroups.com.
Django je založen na třívrstvém modelu MVC.Tedy v modulech (aplikacích) defaultně vytváří vrstvy:models (M) -> views (C) -> a přidáváme ještě templates (V)V Django asi bývá zvykem všechnu logiku zahrnout do modelů a hotovo.
Obecně při vývoji není dobré psát dlouhé špagetové soubory (soubor a třída do 200 řádků, funkce do 40 řádků), avšak pro větší moduly tyto tři vrstvy budou málo.Já to řeším mj. dalšími vrstvami repository a service.model -> repository -> service -> view -> template
model: definuje jen jak entity dat vypadají, jaké mají vztahy atp., prakticky obsahuje jen fields a metarepository: zahrnuje veškerou logiku úložiště (jako režii s SQL, soubory, sítí, pamětí...) a ukládá či poskytuje naplněné modely dále vrstvě service (service neřeší jak a odkud se modely berou)service: obsahuje business logiku (jako ověření práv uživatele, přidává informaci o jazykové mutaci) a poskytuje konkrétní funkcionalitu vrstvě view nebo pro apiview: zpracovává request, messages..., a je prošpikovaná mnoha try-except... a z logiky pouze volá svou funkci ve vrstvě servicetemplate: zobrazí obdržená data od view v html šabloně
aby models.py tak nebobtnal, vytvářím ještěforms: definuje jednotlivé formuláře a poskytuje naplněné modely (jako property)fields: jednotlivé *field pro formuláře se svou validací
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/6c366b03-839d-4dcd-bc68-817caaaaa179%40googlegroups.com.
On Sun, Sep 2, 2018, 19:14 PavelZet <zeh...@gmail.com> wrote:Django je založen na třívrstvém modelu MVC.Tedy v modulech (aplikacích) defaultně vytváří vrstvy:models (M) -> views (C) -> a přidáváme ještě templates (V)V Django asi bývá zvykem všechnu logiku zahrnout do modelů a hotovo.Ne, django neni MVC, nikdy nebylo. Porusuje ty principy ve spouste mistech.
Obecně při vývoji není dobré psát dlouhé špagetové soubory (soubor a třída do 200 řádků, funkce do 40 řádků), avšak pro větší moduly tyto tři vrstvy budou málo.Já to řeším mj. dalšími vrstvami repository a service.model -> repository -> service -> view -> templateTajmestvi toho je, ze zadna z tech vrstev nemusi byt v jednom souboru, nic vas k tomu nenuti a muzete mit kod strukturovany (skoro) jak chcete.
model: definuje jen jak entity dat vypadají, jaké mají vztahy atp., prakticky obsahuje jen fields a metarepository: zahrnuje veškerou logiku úložiště (jako režii s SQL, soubory, sítí, pamětí...) a ukládá či poskytuje naplněné modely dále vrstvě service (service neřeší jak a odkud se modely berou)service: obsahuje business logiku (jako ověření práv uživatele, přidává informaci o jazykové mutaci) a poskytuje konkrétní funkcionalitu vrstvě view nebo pro apiview: zpracovává request, messages..., a je prošpikovaná mnoha try-except... a z logiky pouze volá svou funkci ve vrstvě servicetemplate: zobrazí obdržená data od view v html šabloněTohle je popis jednoho arbitrarniho rozdeleni jak to delaji nektere produkty a frameworky, nikoli nejaka komplexni teorie, natoz dogma. Zkuste premyslet spis nad tim jak to ma django a jak se to dela v djangu nez se snazit namapovat jeden framework na druhy.
aby models.py tak nebobtnal, vytvářím ještěforms: definuje jednotlivé formuláře a poskytuje naplněné modely (jako property)fields: jednotlivé *field pro formuláře se svou validacíForms a modely maji uplne jiny vyznam a duvod, neni jakkoliv mozne rict, ze vyvarim forms aby models nebobtnal.
Dne neděle 2. září 2018 19:23:13 UTC+2 Honza Král napsal(a):On Sun, Sep 2, 2018, 19:14 PavelZet <zeh...@gmail.com> wrote:Django je založen na třívrstvém modelu MVC.Tedy v modulech (aplikacích) defaultně vytváří vrstvy:models (M) -> views (C) -> a přidáváme ještě templates (V)V Django asi bývá zvykem všechnu logiku zahrnout do modelů a hotovo.Ne, django neni MVC, nikdy nebylo. Porusuje ty principy ve spouste mistech.To už je asi slovíčkaření, jestli dobře známé MVC, MTV nebo MVT. Principy jsou obdobné, šlo hlavně o zmínění třívrstvého modelu (který se obecně osvědčil).
Obecně při vývoji není dobré psát dlouhé špagetové soubory (soubor a třída do 200 řádků, funkce do 40 řádků), avšak pro větší moduly tyto tři vrstvy budou málo.Já to řeším mj. dalšími vrstvami repository a service.model -> repository -> service -> view -> templateTajmestvi toho je, ze zadna z tech vrstev nemusi byt v jednom souboru, nic vas k tomu nenuti a muzete mit kod strukturovany (skoro) jak chcete.Původně jsem chápal dlouhé špagetové soubory (models, views, ...) s mnoha kraťoučkými stereotypními funkcemi a třídami právě jako styl vývoje ražený Djangem.Ale pokud to není "django-style", rozkládání jednotlivých tříd na soubory (jak se to dělá jinde) jen a jen uvítám.Třeba models.py by měl sloužit jen jako výčet modelů a jednotlivé třídy modelů budou v jednotlivých souborech v podadresáři models (např. models/ProfileModel.py) ?Nebo models.py vůbec není potřeba (pryč s ním) a místo něj stačí zmíněný podadresář models (se všemi modely po souborech) se souborem models/__init__.py (který původní models.py prakticky nahradí a ušetřím si psaní) ?Je ale vhodné rozkládat na soubory i views.py, který neobsahuje třídy, ale jen funkce ?Díky za reakci.
model: definuje jen jak entity dat vypadají, jaké mají vztahy atp., prakticky obsahuje jen fields a metarepository: zahrnuje veškerou logiku úložiště (jako režii s SQL, soubory, sítí, pamětí...) a ukládá či poskytuje naplněné modely dále vrstvě service (service neřeší jak a odkud se modely berou)service: obsahuje business logiku (jako ověření práv uživatele, přidává informaci o jazykové mutaci) a poskytuje konkrétní funkcionalitu vrstvě view nebo pro apiview: zpracovává request, messages..., a je prošpikovaná mnoha try-except... a z logiky pouze volá svou funkci ve vrstvě servicetemplate: zobrazí obdržená data od view v html šabloněTohle je popis jednoho arbitrarniho rozdeleni jak to delaji nektere produkty a frameworky, nikoli nejaka komplexni teorie, natoz dogma. Zkuste premyslet spis nad tim jak to ma django a jak se to dela v djangu nez se snazit namapovat jeden framework na druhy.A jak to dělá django :) ?
Model by tedy měl:- definovat strukturu entity (popis tabulky)- uchovávat obsah entity (konkrétní data entity)- určovat vzhled na frontendu (propojení s widgety)
- dolovat data z úložiště (funkce čtení z databáze, sítě, paměti atd., tedy zastává funkci repozitáře)?
A business logiku bych měl uchovávat v nové vrstvě service nebo kde ? Do models ani views se mi nehodí :(
aby models.py tak nebobtnal, vytvářím ještěforms: definuje jednotlivé formuláře a poskytuje naplněné modely (jako property)fields: jednotlivé *field pro formuláře se svou validacíForms a modely maji uplne jiny vyznam a duvod, neni jakkoliv mozne rict, ze vyvarim forms aby models nebobtnal.Těch důvodů proč oddělit forms a fields je víc a docela se mi to osvědčilo.
Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/0c8c53ca-5ac9-4662-aae0-7006b466e46f%40googlegroups.com.