[英]how to filter many-to-many fields in django models
我有 3 個模型: User
、 Tag
和Recipe
。 User
model 非常基礎,並不重要。 這是Tag
model:
class Tag(models.Model):
name = models.CharField(max_length=255)
user = models.ForeignKey(settings.AUTH_USER_MODEL , on_delete=CASCADE)
這是Recipe
model:
class Recipe(models.Model):
user = models.ForeignKey(settings.AUTH_USER_MODEL , on_delete=CASCADE)
title = models.CharField(max_length=255)
tags = models.ManyToManyField('Tag',)
我為所有這些模型制作了端點,但有一個問題! 當我嘗試創建Recipe
object 時,將列出所有Tag
對象,但我只想列出登錄的用戶標簽。
這是我的Tag
序列化程序:
class TagSerializer(serializers.ModelSerializer):
class Meta:
model = models.Tag
fields = ('id' , 'name')
extra_kwargs = {
'id' : {
'read_only' : True,
}
}
這是我的Tag
視圖集:
class TagsView(RecipeAttrsView):
queryset = models.Tag.objects.all()
serializer_class = serializers.TagSerializer
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
return self.queryset.filter(user=self.request.user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
如何過濾標簽,以便所有列出的標簽對象都屬於登錄用戶?
queryset
僅創建一次,即在您啟動服務器時。 因此,queryset 屬性在進程啟動時進行評估,即當您的頁面呈現時,這會導致class TagsView
視圖執行。
每個請求都會調用一個get_queryset
方法,如果您想動態調整查詢,這可能特別有用,我認為您在這里嘗試這樣做。 因此get_queryset
是一種應該用來代替queryset
變量的方法,作為它的替代方法,提供了更大的靈活性。
你真的不需要他們兩個在一起,這可能會導致你的問題。 你可以這樣做。
class TagsView(RecipeAttrsView):
serializer_class = serializers.TagSerializer
authentication_classes = (authentication.TokenAuthentication,)
permission_classes = (permissions.IsAuthenticated,)
def get_queryset(self):
return models.Tags.objects.filter(user=self.request.user)
def perform_create(self, serializer):
serializer.save(user=self.request.user)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.