[英]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.