我有以下型号:
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”实例。
这似乎是一项简单而微不足道的任务,但我无法使其发挥作用。
答案 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