相关字段嵌套查找错误

时间:2016-06-14 10:40:19

标签: django orm foreign-keys lookup

我有以下型号:

class Profile(models.Model):
    user = models.ForeignKey(User)# User can have more than one profile

class Order(models.Model):
    ship_to = models.ForeignKey(Profile)

class Shipping(models.Model):
    order = models.ForeignKey(Order)# one order can have more than one shipping
    shipping_company = models.ForeignKey(Shipping_company)


class Shipping_company(models.Model):
    name = ...

所以现在我有以下结构:

User > Receiver > Order > Shipping > Shipping_company

问题是:我如何获得与特定运输公司订购的所有用户型号?

如果我这样做一个查询

User.objects.filter(receiver__order__shipping__shipping_company__pk=1)

我得到了

  

FieldError:关系字段不支持嵌套查找

如果我做这样的事情

sh_comp = items.objects.get(pk=1) # __unicode__ returns "FedEx"
User.objects.filter(receiver__order__shipping__shipping_company=sh_comp)

结果是

  

ValueError:无法查询“FedEx”:必须是“Receiver”实例。

这似乎是一项简单而微不足道的任务,但我无法使其发挥作用。

1 个答案:

答案 0 :(得分:1)

可采取的一种方法如下(我只考虑您在问题中提出的四种模式),

您在Shipping模型中拥有Shipping公司的外键。所以你可以在Shipping_company模型上使用模型函数。

看一下这个模型函数

class Shipping_company(models.Model):

   fields... 

   def get_profiles(self):
       shippings = Shipping.objects.filter(shipping_company=self)
       users = list(set([x.order.ship_to for x in shippings]))

<强>解释

shippings = Shipping.objects.filter(shipping_company=self)

将返回一家航运公司的所有发货(在您的情况下为FedEx)。进一步循环收货,从订单字段获取 ship_to

PS:您可以将其作为参考并设计自己的解决方案。

<强>操作实例:

让我们说有货运公司'联邦快递'。我们这样做,

fedex = Shipping_company.objects.get(name='FedEx')

现在,当你在fedex上调用get_profiles时,就像

一样
fedex.get_profiles()

会发生什么事。

fedex实例现在引用get_profiles()函数中的self。 使用self(fedex),我们会过滤掉fedex的 shippings 。 然后我们遍历这些发送以获得订单每次发货,并且每个订单都有一个 ship_to(个人资料)外键。

我想,由于返回声明,您会感到困惑。

以精心制作的方式,整个功能看起来像这样

def get_profiles(self):
    users = list()
    shippings = Shipping.objects.filter(shipping_company=self)
    for shipping in shippings:
        order = shipping.order
        #Now you have an order per shipping, so you do
        if not order.ship_to in users:
            users.append(order.ship_to)
    return users