Stejný kód v getteru objektu (@property) a v metodě querysetu - DRY

20 views
Skip to first unread message

Fosil

unread,
Jun 18, 2019, 4:57:43 PM6/18/19
to django-cs
Zdravím,
řeším následující problém:

Mám model:

class Article(models.Model):
 
...
  publication_start
= models.DateTimeField("Zacatek publikace")
  publication_end
= models.DateTimeField("Konec publikace")
  approved
= models.BooleanField("Schváleno", default=False)
 
...


 
# k tom u custom queryset

 objects
= ArticleQuerySet.as_manager()



class ArticleQuerySet(models.QuerySet):



 
def in_state(self, state):


    now
= timezone.now()


   
# draft
   
if state == 'draft':
     
return self.filter(approved=False)


   
# published
   
if state == 'published':
     
return self.filter(approved=True).filter(publication_start__lte=now).filter(publication_end__gte=now)


   
# expired
   
if state == 'expired':
       
return self.filter(approved=True).self.filter(publication_end__lte=now)


a zároveň chci v tom modelu mít definovaný getter, který mi pro konkrétní instanci vrátí její stav
tzn.:

class Article(models.Model):

 
...
 
...
 
@property
 
def state(self):
   
# tady v podstate (alepon tedy ideove) stejny kod jako v ArticleQuerySet.in_state, ale vraci hodnoty 'draft'|'published'|'expired'


a teď už konečně otázka:
šlo by to nějak napsat aby buznys logika toho rozhodování stavu byla na jednom místě - páč když se změní tak jí musím přepisovat na dvou místech a to neprospívá kódu ani životnímu prostředí :-)

Díky za každé nakopnutí (v pozitivním smyslu slova)

starenka .

unread,
Jun 19, 2019, 3:31:56 AM6/19/19
to djan...@googlegroups.com
Cau Fosile, 

jmeno toho "getteru" mi hlava nebere, ale co kdyby vnitrek byl neco ala:

@property
def state(self):
    self.in_state('published') | self.in_state('expired') .....


Hm? 

---
aknerats[::-1]

--
--
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/026b41c8-4798-46db-bdee-56c6bfad5d8a%40googlegroups.com.
Další možnosti najdete na https://groups.google.com/d/optout.

starenka .

unread,
Jun 19, 2019, 3:34:23 AM6/19/19
to djan...@googlegroups.com
Jo aha, ty fakt chces vratit ten "state" jakoze string :) Hele a neni jednodussi se ten field proste hodit na model a udrzovat si ho pomoci signalu/savu apod? Pak mas pokoj (na dvou mistech minimalne) ;)
---
In Perl you shoot yourself in the foot, but nobody can understand how you did it. Six months later, neither can you. | print 'aknerats'[::-1]

Martin Samsula

unread,
Jun 19, 2019, 3:38:03 AM6/19/19
to djan...@googlegroups.com
Zdravim, Fosil chtel asi spocitat `state` z tech ostatnich trech poli, ne?

Neco jako:
```
class Article(models.Model):

@property
def state(self):
if self.approved:
return 'draft'
elif self.approved and publication_start <= now and publication_end >= now:
return 'published'
.... atd.
```
coz je "reverzni" definice/operace k podminkam v `ArticleQuerySet.in_state`.

Asi bych si rac pridal pole `state` do modelu a nastavoval ho explicitne.





st 19. 6. 2019 v 9:31 odesílatel starenka . <star...@gmail.com> napsal:
> Chcete-li tuto diskusi zobrazit na webu, navštivte https://groups.google.com/d/msgid/django-cs/CA%2B7MNVpxNnXi0LN3JhOL6JZQCYEAVnp_Hn1TWd8UkRkunry%3D%3Dg%40mail.gmail.com.

Petr Messner

unread,
Jun 19, 2019, 4:58:34 AM6/19/19
to djan...@googlegroups.com
Mozna by to šlo vyřešit přes view v databázi, které by ten state pocitalo.

Petr Messner

18. 6. 2019 v 22:57, Fosil <filip....@gmail.com>:

Fosil

unread,
Jun 19, 2019, 12:35:58 PM6/19/19
to django-cs
Ano, v mnoha případech by to uložení fieldu držícícho stav bylo ideální, ale tady je problém v tom, že výsledný stav je závislý na aktuálním čase, takže tady to nejde - to je to co řeším

Dne úterý 18. června 2019 22:57:43 UTC+2 Fosil napsal(a):
Reply all
Reply to author
Forward
0 new messages