Thanks for the answer. As said, the @property + python method wouldn't work for my use case, as I need to be able to use the field in the queryset to filter/order (plus my actual computed field use aggregates expressions).
Cheers, Olivier On Thu, 6 Jun 2019 at 12:36, Chetan Ganji <[email protected]> wrote: > I had a similar need in one of my clients project, I ended up using > @property and a python method. > > AFAIK, AnnotationField is absent from django models. If you would like to > write one, below is the material you need to refer. > https://docs.djangoproject.com/en/2.2/howto/custom-model-fields/ > > > Regards, > Chetan Ganji > +91-900-483-4183 > [email protected] > http://ryucoder.in > > > On Thu, Jun 6, 2019 at 3:36 PM Olivier Dalang <[email protected]> > wrote: > >> Dear list, >> >> I was wondering whether there's a package or pattern to define >> annotations as model fields, so that they could really be used as >> database-side computed fields. >> >> Currently, I do something like this (not tested, it's a simplified case): >> >> class SalesManager(models.Manager): >> def get_queryset(self): >> return super().get_queryset().annotate( >> profit=F("selling_price")-F("buying_price") >> ) >> >> class Sales(models.Model): >> objects = SalesManager() >> >> buying_price = models.FloatField() >> selling_price = models.FloatField() >> ... >> >> Ideally, I'd see something like : >> >> class Sales(models.Model): >> buying_price = models.FloatField() >> selling_price = models.FloatField() >> profit = models.AnnotationField(F("selling_price")-F("buying_price")) >> ... >> >> An AnnotationField would behave like a read-only field, excepted that it >> wouldn't have a database column. >> >> This would have the following benefits : >> - much less verbose >> - all instance related stuff in one place >> - it would make it possible to refer to "profit" as a model field >> - you could use the field in Meta.ordering >> - you could easily display in django.admin without additional methods >> >> Of course similar result can be achieved with @property and a python >> method, but I really need this to be on the database side to use >> subqueries, sorting and filtering, etc. >> >> Does anything like this exist ? Is it possible to emulate this behaviour >> somehow ? >> >> Thanks !! >> >> Olivier >> >> >> -- >> You received this message because you are subscribed to the Google Groups >> "Django users" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> To post to this group, send email to [email protected]. >> Visit this group at https://groups.google.com/group/django-users. >> To view this discussion on the web visit >> https://groups.google.com/d/msgid/django-users/CAExk7p3eXvCUCxB3LgZJHTrVXzLuD%3DNqUE79a-dqtUXzekXgJg%40mail.gmail.com >> <https://groups.google.com/d/msgid/django-users/CAExk7p3eXvCUCxB3LgZJHTrVXzLuD%3DNqUE79a-dqtUXzekXgJg%40mail.gmail.com?utm_medium=email&utm_source=footer> >> . >> For more options, visit https://groups.google.com/d/optout. >> > -- > You received this message because you are subscribed to the Google Groups > "Django users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at https://groups.google.com/group/django-users. > To view this discussion on the web visit > https://groups.google.com/d/msgid/django-users/CAMKMUjscehKiqt4Gcu3Cnm%2BHKhH8Y98RnGhR6chVZ7NS5qc-sw%40mail.gmail.com > <https://groups.google.com/d/msgid/django-users/CAMKMUjscehKiqt4Gcu3Cnm%2BHKhH8Y98RnGhR6chVZ7NS5qc-sw%40mail.gmail.com?utm_medium=email&utm_source=footer> > . > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Django users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/django-users. To view this discussion on the web visit https://groups.google.com/d/msgid/django-users/CAExk7p1PBMC7rR4iBu_80pwTBoie4NydB9gk0jKAqOqNwCGhZQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

