相关字段嵌套查找错误
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
我有以下型号:
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