簡體   English   中英

將動態字段添加到Django-rest-framework中的序列化器

[英]Adding dynamic fields to a serializer in django-rest-framework

我有一個模特

    class Event(models.Model):
        random_fields...

    class Registrations(models.Model):
        user = models.ForeignKey(User...)
        event = models.ForeignKey(Event...)
        ts = models.DateTimeField(...)

現在,我想獲取所有事件的列表以及發出request的用戶是否已在該事件中注冊(可能是Event的ModelSerializer中的is_registered字段)。

理想情況下,這應該在單個請求中進行,而不要太多database queries

有效的方法是什么?

我認為您可以使用與預取相關的方法來減少數據庫查詢。 從事件中獲取注冊時,可以使用prefetch_related一次獲取所有注冊(因此不需要多個數據庫查詢)。

因此,首先,您可以定義如下模型:

class Registrations(models.Model):
    user = models.ForeignKey(User...)
    event = models.ForeignKey(Event, related_name="registrations",..)

然后,您可以像這樣定義EventSerializer

class EventSerializer(serializer.ModelSerializer):
    registrations = RegistrationSerializer(many=True, read_only=True)  # <-- getting all registraions via RegistrationSerializer
    is_invited = serializer.SerializerMethodField()

    class Meta:
       model = Event
       fields = "__all__"

    def get_is_invited(self, obj):
        return obj.registrations.filter(user=self.context.get("request").user).exists()  # does not make any DB query

此處是否使用SerializerMethodField來獲取是否邀請用戶。

現在,在視圖中,調用Event ,使用prefetch_related

# A minimal example

class SomeView(APIView):
    def get(self, request, **kwargs):
        qset = Event.objects.prefetch_related('registrations').all()
        serializer = EventSerializer(qset, many=True)
        return Response(serializer.data)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM