Thanks Chetan for trying to help, but please read carefully the issue, as you didn't understand what I'm trying to do.
In the meantime, and for the record, I found this, which works for simple cases. https://github.com/schinckel/django-computed-field On Thu, 6 Jun 2019 at 14:57, Chetan Ganji <[email protected]> wrote: > I think this would solve your problem. Whatever calculations needs to be > done, you can do it manually before saving the Sales instance. > Preferably after checking if form.is_valid() in case of django and in the > function perform_create() in case of django rest framework. > > > class Sales(models.Model): > buying_price = models.FloatField() > selling_price = models.FloatField() > profit = models.models.FloatField() > > > Cheers! > > > Regards, > Chetan Ganji > +91-900-483-4183 > [email protected] > http://ryucoder.in > > > On Thu, Jun 6, 2019 at 4:50 PM Olivier Dalang <[email protected]> > wrote: > >> 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 >> <https://groups.google.com/d/msgid/django-users/CAExk7p1PBMC7rR4iBu_80pwTBoie4NydB9gk0jKAqOqNwCGhZQ%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/CAMKMUjtqs1a9t7XKoDQcPxZm1CrC7eqyD7jCZSDG12-KKyd0HA%40mail.gmail.com > <https://groups.google.com/d/msgid/django-users/CAMKMUjtqs1a9t7XKoDQcPxZm1CrC7eqyD7jCZSDG12-KKyd0HA%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/CAExk7p1ddVqskXV%3DKQXtri5cLTwJutzFeZDz5aeDanVGTcKHtQ%40mail.gmail.com. For more options, visit https://groups.google.com/d/optout.

