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 . <[email protected]> napsal:
>
> 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]
>
> On Tue, Jun 18, 2019, 22:57 Fosil <[email protected]> wrote:
>>
>> 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)
>>
>> --
>> --
>> 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/026b41c8-4798-46db-bdee-56c6bfad5d8a%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 tuto diskusi zobrazit na webu, navštivte 
> https://groups.google.com/d/msgid/django-cs/CA%2B7MNVpxNnXi0LN3JhOL6JZQCYEAVnp_Hn1TWd8UkRkunry%3D%3Dg%40mail.gmail.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/CAA3u1XmnJWD2hBh9C%3D_YDPE5r0SHjM7q5PwsM2B8s%3DxpuDThwQ%40mail.gmail.com.
Další možnosti najdete na adrese https://groups.google.com/d/optout.

Reply via email to