首页 > 解决方案 > 在 Django 中查询用户相关对象

问题描述

在我的应用程序中,我试图查询一个需要反向查找的字段。让我通过模型来解释

模型.py

class User(AbstractUser):
    is_employee = models.BooleanField(default=False)
    is_client = models.BooleanField(default=False)

class Client(models.Model):
   
    user = models.OneToOneField(User, on_delete=models.CASCADE, primary_key=True)
    client_name = models.CharField(max_length=500, default=0)


class MaterialRequest(models.Model):

    owner = models.ForeignKey(User, on_delete=models.CASCADE)
    flows = models.ManyToManyField(MaterialRequestFlow)
    is_allocated = models.BooleanField(default=False)

class Allotment(models.Model):

    transaction_no = models.IntegerField(default=0)
    dispatch_date = models.DateTimeField(default=datetime.now)
    send_from_warehouse = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
    sales_order = models.ForeignKey(MaterialRequest, on_delete=models.CASCADE)

现在我想查询Allotment哪些是由特定的Client. 在前端,我有一个下拉列表,其中Clients发送idClient

这是我的功能:

视图.py

class AllotmentReport(APIView):
    permission_classes = (permissions.IsAuthenticated,)

    def get(self, request, *args, **kwargs):
        cname = self.kwargs['cname']
        if self.kwargs['cname']:
            items = Allotment.objects.filter(sales_order__owner??? = cname).order_by('-id')    #Need Help Here
        else:
            items = Allotment.objects.all().order_by('-id')
            
        serializer = AReportSerializer(items, many=True)

        return Response(serializer.data, status=status.HTTP_201_CREATED)

我也想知道是否有更好的选择

标签: djangodjango-rest-framework

解决方案


def get(self, request, *args, **kwargs):
        cname = self.kwargs['cname']
        if self.kwargs['cname']:
            client = Client.objects.get(id=cname)
            items = Allotment.objects.filter(sales_order__owner=client.user).order_by('-id')
        else:
            items = Allotment.objects.all().order_by('-id')
            
        serializer = AReportSerializer(items, many=True)

    return Response(serializer.data, status=status.HTTP_201_CREATED)

推荐阅读