Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parameterized property in Django

For example, I have two models:

class Page(models.Model):
   # Some fields
   ...

   @property
   def title(self):
      return PageTranslation.objects.get(page=self, language=language).title # I can not pass property to the parameter

class PageTranslation(models.Model):
   page = models.ForeignKey(Page)
   title = models.CharField()

And some DRF view, which get_queryset method looks like this:

def get_queryset(self):
   return Page.objects.all()

And serializer:

class PageSerializer(serializers.ModelSerializer):
   class Meta:
       model = Page
       fields = (..., 'title',) # title = property

I want to return QuerySet with Page model instances, and use title property in serializer, but I can not pass language (that is set somewhere in the request — headers, query param, etc) there.

What is the correct way to do this?

like image 530
artem Avatar asked Apr 02 '26 14:04

artem


1 Answers

from django.utils.translation import get_language
from django.config import settings



class Page(models.Model):

    @property
    def title(self):
        language = get_language() or settings.LANGUAGE_CODE
        return PageTranslation.objects.get(page=self, language=language).title

get_language() gives you the current active language, if i18n is disabled it gives you None, and for that we have the settings.LANGUAGE_CODE fallback.

For the serializer part, I think you are supposed to explicitly say that your property is a field, ModelSerializer only finds the actual database fields for you, nothing else.

class PageSerializer(serializers.ModelSerializer):
    title = serializers.Field()

    class Meta:
        model = Page
        fields = (..., 'title',)
like image 52
Işık Kaplan Avatar answered Apr 04 '26 03:04

Işık Kaplan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!