![](/img/trans.png)
[英]django-rest-framework how to make model serializer fields required
[英]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.