如何在Django Rest框架中过滤ManyToManyField

时间:2020-08-31 10:12:53

标签: python django django-models django-rest-framework django-views

我有一个模型Offlinecheckout和CartItem模型。我想在离线结帐模型中添加购物车字段的过滤查询集。由于它显示了所有用户的购物车。我想按request.user过滤queryset。这样,购物车字段将仅显示在购物车request.user中,而不显示在其他用户中。

如何在该字段中添加过滤器。

enter image description here

Models.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)

serializers.py

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

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

views.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

1 个答案:

答案 0 :(得分:0)

您可以在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 objects

如果您需要进一步的帮助,请发表评论