簡體   English   中英

如何過濾 django 模型中的多對多字段

[英]how to filter many-to-many fields in django models

我有 3 個模型: UserTagRecipe 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.

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