【问题标题】:Django Filtering based on field values in基于字段值的Django过滤
【发布时间】:2013-11-22 10:10:56
【问题描述】:

我正在使用 Django,我想在其中使用过滤器

我的产品和公司型号是

class Product(models.Model):
    name = models.CharField(max_length=200)
    companyId = models.ForeignKey(Comapany)

class Company(models.Model):
    domain = models.CharField(max_length=200)

我想根据当前用户的 companyId 检索产品。所以我已经像这样实现了我的观点..

class ListProducts(APIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)

def get(self, request):
        if request.user.is_authenticated():
            userCompanyId = request.user.get_profile().companyId
        products = Product.objects.filter(companyId__id__exact = userCompanyId)
        serializer = ProductSerializer(products)
        return Response(serializer.data)

我的产品数据

{
   "_id": ObjectId("5284ceaae9cfff79368e1f29"),
   "companyId": "528458c4bbe7823947b6d2a3",
   "name": "Apple Juice" 
}
{
   "_id": ObjectId("5267bb4ebbe78220588b4567"),
   "companyId": "52674f02bbe782d5528b4567",
   "name": "Small Soft & Moist Cranberry" 
}

我的公司资料

{
   "_id": ObjectId("528458c4bbe7823947b6d2a3"),
   "domain": "Manufacturing" 
}
{
   "_id": ObjectId("52674f02bbe782d5528b4567"),
   "domain": "Manufacturing" 
}

我的输出为[]

问题是,在研究 django doc 中的过滤器时,我无法获得它。所以请帮助我..

【问题讨论】:

  • 粘贴您的用户配置文件模型定义?
  • 类 UserProfile(models.Model): user = models.ForeignKey(User,unique=True) companyId = models.IntegerField()
  • 我已经用公司模型和新视图更新了我的问题。我没有收到上一个错误,而是将 [] 作为输出

标签: python django mongodb django-rest-framework


【解决方案1】:

我解决了这个错误。实际上,指定产品模型的companyId 引用公司模型的Id 字段的方式是错误的。所以我看到了 userprofile 如何引用 user 模型。我在这里提到我的更改。

产品型号

class Product(models.Model):
    name = models.CharField(max_length=200)
    company = models.ForeignKey(Company,null=True)

查看

class ListProducts(APIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAdminUser,)
    model = Product

    def get(self, request):
        if request.user.is_authenticated():
            userCompanyId = request.user.get_profile().companyId
        products = Product.objects.filter(company = userCompanyId)
        serializer = ProductSerializer(products,many=True)
        return Response(serializer.data)

像这样将 company_id 放入公司数据中

{
   "_id": ObjectId("5284ceaae9cfff79368e1f29"),
   "company_id": "528458c4bbe7823947b6d2a3",
   "name": "Apple Juice" 
}

【讨论】:

    【解决方案2】:

    显然您的用户配置文件模型的companyId 不是整数字段,因此您应该调整您的Product 模型以具有兼容的companyId 类型。哦,是的:你没有Company 模型吗?

    【讨论】:

    • 哦,是的,我有公司模型。但是当我使用像 companyId = models.ForeignKey(Company) 这样的 ForeignKey 时,它给了我错误,因为字段 id 不能为空。
    • 我已经用公司模型和新视图更新了我的问题。我没有收到上一个错误,而是将 [] 作为输出
    【解决方案3】:

    这一行:

    ProductSerializer(products)
    

    应该是:

    ProductSerializer(products, many=True)
    

    否则,尽管您的问题似乎与 Django REST 框架无关,只是与您正在运行的特定过滤器不返回任何结果有关。

    仔细检查request.user.get_profile() 是否返回了正确的配置文件,仔细检查userCompanyId 是否设置正确,并仔细检查Product.objects.filter(companyId__id__exact=userCompanyId).count() 返回的结果数量。

    我猜你要么有 userCompanyId 设置不正确,要么只是没有任何匹配的 Product 记录。

    【讨论】:

    • 我仔细检查了所有东西.. userCompanyId 返回“528458c4bbe7823947b6d2a3”但是当我返回 Product.objects.filter(companyId__id__exact=userCompanyId).count() 它给我 0 作为输出。虽然我正在用所有产品和公司数据更新我的问题,所以你可以检查我错在哪里。我认为问题是 companyId__id__exact
    • "_id": ObjectId("52674f02bbe782d5528b4567"),
    • 看起来你真的很想做Product.objects.filter(companyId__exact = userCompanyId),因为你的 companyId 字段似乎是一个字符串,而不是一个关系。这实际上只是一个关于正确过滤 mongoengine 的问题,(与 REST 框架无关)所以如果你没有取得进展,我建议你改写问题 just 专注于查询的位没有返回您期望的结果,无论是在此处还是在 mongoengine 用户组/IRC 上(如果有)。
    • 我解决了错误。非常感谢您的建议。我已经给出了答案来证明我是如何解决这个问题的..
    猜你喜欢
    • 2021-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 1970-01-01
    相关资源
    最近更新 更多