相关字段嵌套查找错误

related field nested lookup error

我有以下型号:

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: Relation fields do not support nested lookups

如果我做这样的东西

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

结果是

ValueError: Cannot query "FedEx": Must be "Receiver" instance.

这似乎是一项简单而微不足道的任务,但我做不到。

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

您在航运模型中有航运公司的外键。因此,您可以在 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)

将 return 一家运输公司(在您的情况下为联邦快递)的所有运输。进一步循环运输以从 order 字段中获取 ship_to

PS:大家可以参考一下,设计自己的方案。

演练:

假设有运输公司'FedEx'。所以我们这样做,

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

现在,当您在 fedex 上调用 get_profiles 时,例如

fedex.get_profiles()

会发生这样的事情

fedex 实例现在在 get_profiles() 函数中引用自身。 使用 self(fedex),我们通过 fedex 过滤掉 shippings。 然后我们遍历那些 shippings 以获得每次运输的 order 并且每个订单都有一个 ship_to(profile )外键。

我想,您是因为 return 语句而感到困惑。

精心设计的整个函数看起来像这样

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