Python 如何从带有外键的表中筛选数据?

Python 如何从带有外键的表中筛选数据?,python,django,django-models,Python,Django,Django Models,我有以下型号: #- coding: utf-8 -# STATUSES = ( (u'R', u'Solicitada'), # Request (u'V', u'Válida'), # Deposit (u'P', u'Imprimiendo'), # Printing (u'S', u'Por Entregar'), # Stock (u'D', u'Entregad

我有以下型号:

#- coding: utf-8 -#

STATUSES = (
    (u'R', u'Solicitada'),           # Request
    (u'V', u'Válida'),               # Deposit
    (u'P', u'Imprimiendo'),          # Printing
    (u'S', u'Por Entregar'),         # Stock
    (u'D', u'Entregada'),            # Delivered
    (u'F', u'Olvidadas')             # Forget
)

class Order(models.Model):
    requester = models.CharField(max_length=128)

class OrderStatus(models.Model):
    order = models.ForeignKey(Order, related_name="statuses")
    status = models.CharField(max_length=1,choices=STATUSES)
    date = models.DateTimeField()
我需要按状态和日期筛选订单。我尝试了以下方法:

orders_sold = Order.objects.all()
orders_sold = orders_sold.filter(statuses__status='V')
但它想返回什么就返回什么,而且有日期,我试过:

orders_sold = orders_sold.filter(statuses__date__range=[from_date,to_date])
但它说“日期”并不存在

我如何才能实现我期待的目标

更新

“日期”给出的错误如下:

Cannot resolve keyword 'date' into field. Choices are: added, additionalinfoorder, email, id, orderitems, password, payment, payment_date, payments, phone, print_orders, requester, statuses, taker, viewed
看这个,;Django不完全支持反向查询功能。你必须采取不同的方法。这里有一个想法-

order_with_status_v = OrderStatus.objects.filter(status='V',date__range=[from_date,to_date]).values('order')
现在需要注意的是,
.values()
从SQL关系中收集值并将其存储在字典中;存储外键的ID,但其他信息丢失。因此,您想要访问的任何信息都必须在
值的参数中列出:

.values('order', 'order__requester')
要在不足2 db的点击率下执行此操作,请尝试以下操作:

# list of the PK of all orders referenced by any OrderStatus with status "V"
order_statuses_v = OrderStatus.objects.filter(status='V',date__range=[from_date,to_date]).values_list('order__pk',flat=True)
# All orders referenced by OrderStatus with status "V"
orders_sold = Order.objects.filter(pk__in=order_statuses_v)

首先,您的
date
字段似乎为空。您可以在首次创建
OrderStatus
对象时将其设为save date:

date = models.DateTimeField(auto_now_add=True)
现在您有了
日期
,您可以按
状态
日期
进行筛选:

orders_sold = Order.objects.filter(statuses__status='V', statuses__date__range=(from_date,to_date))

我认为您链接到的文章没有明确指出Django不支持反向查找。据我所知,它并不总是最好的查询方式,因为它会对数据库进行大量查询。嗯,ORM查询机制不支持这种方式(每次调用
某个\u对象。相关的\u对象。all()
,您都会点击数据库)。在您的情况下,最好从
OrderStatus
级别开始查询。我将在上面的回答中添加另一个选项。看起来我们对“支持”有不同的想法,但意见的多样性很好:),我同意性能部分…@Roger_Gonzalez我认为你的第一个查询是有效的,你确定至少有一个订单的状态从未是“V”吗?是的,我有几个状态(每个状态至少20个)。当我只选择“V”时,它会返回“R”、“P”或其他任何内容。唯一有效的是“F”@Avenet是否可以将“日期”不存在异常回溯添加到问题?请参阅后期编辑@avenet@Roger_Gonzalez我不明白你说它返回“R”、“P”等是什么意思,因为查询应该返回订单,而不是状态。我用你的代码做了一个简单的测试,创建了一个状态为“V”的订单和另一个状态为“P”的订单,一切正常。我确实填充了“日期”,我从表单中获取它。它只是说“状态日期”不存在。@RogerGonzalez您确定
DateTime
字段的名称是
date