簡體   English   中英

如何在 django rest 框架中過濾 ManyToManyField

[英]How to filter ManyToManyField in django rest framework

我有一個模型 Offlinecheckout 和 CartItem 模型。 我想在離線結賬模型中添加購物車字段的過濾查詢集。 因為它顯示了所有用戶的購物車。 我想通過 request.user.So 過濾查詢集,因此提交的購物車將顯示在購物車 request.user 中,而不是其他用戶。

我如何在該字段中添加過濾器。

在此處輸入圖片說明

模型.py

class OfflineCheckOut(models.Model):
    user = models.ForeignKey('accounts.User', on_delete=models.CASCADE)
    cart = models.ManyToManyField('cart.CartItem')
    time_slot = models.ForeignKey('category.TimeSlot', on_delete=models.CASCADE)
    state = models.CharField(max_length=254)
    city = models.CharField(max_length=254)
    address = models.CharField(max_length=254)
    landmark = models.CharField(max_length=254, blank=True)
    # order_id = models.ForeignKey('cart.CartModel', on_delete=models.CASCADE)
    date = models.DateField()
    tsn_amount = models.IntegerField()

    def __str__(self):
        return self.user.username

class CartItem(models.Model):
    cart = models.ForeignKey('CartModel', on_delete=models.CASCADE)
    user = models.ForeignKey('accounts.User', on_delete=models.CASCADE)
    service = models.ForeignKey('accounts.SubCategory', on_delete=models.CASCADE)
    defects = models.ForeignKey('category.Defects', on_delete=models.CASCADE)
    quantity = models.IntegerField(default=1)
    price = models.IntegerField()
    created_on = models.DateTimeField(auto_now_add=True)
    updated_on = models.DateTimeField(auto_now_add=True)

序列化程序.py

from rest_framework import serializers
from .models import Address, Date, OfflineCheckOut

class OfflineSerializer(serializers.ModelSerializer):
    class Meta:
        model = OfflineCheckOut
        fields = "__all__"

視圖.py

class offlineViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser or user.is_Customer:
                    return OfflineCheckOut.objects.all()
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()

    serializer_class = OfflineSerializer

您可以使用 Django 中的FilteredRelation過濾關系

請更改您的views.py如下

from django.db.models import FilteredRelation, Q

class offlineViewSet(viewsets.ModelViewSet):
    permission_classes = (IsAuthenticated,)
    def get_queryset(self):
        user = self.request.user
        if user.is_authenticated:
            if user is not None:
                if user.is_active and user.is_superuser or user.is_Customer:
                     ### Use filtered relation 
                    return OfflineCheckOut.objects.filter(user=user).annotate(user_cart=FilteredRelation('cart', condition=Q(cart__user=user)))   
                raise PermissionDenied()
            raise PermissionDenied()
        raise PermissionDenied()

    serializer_class = OfflineSerializer

我希望這會幫助您解決問題。

有關更多信息,請參閱FilteredRelation 對象

如果您需要進一步的幫助,請發表評論

暫無
暫無

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

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