【发布时间】:2010-10-31 06:14:35
【问题描述】:
我有一个网上商店应用程序中的订单模型,具有自动递增的主键和自身的外键,因为订单可以拆分为多个订单,但必须保持与原始订单的关系。
class Order(models.Model):
ordernumber = models.AutoField(primary_key=True)
parent_order = models.ForeignKey('self', null=True, blank=True, related_name='child_orders')
# .. other fields not relevant here
我已经为管理站点注册了一个 OrderAdmin 类。对于详细视图,我在 fieldsets 属性中包含了 parent_order。当然,默认情况下,这会在选择框中列出所有订单,但这不是所需的行为。相反,对于没有父订单的订单(即没有从另一个订单拆分;parent_order 为 NULL/None),不应显示任何订单。对于已拆分的订单,这应该只显示单父订单。
有一个相当新的 ModelAdmin 方法可用,formfield_for_foreignkey,这似乎非常适合,因为可以在其中过滤查询集。假设我们正在查看订单#11234 的详细视图,该订单已从订单#11208 中拆分出来。代码如下
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == 'parent_order':
# kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=11234)
return db_field.formfield(**kwargs)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
注释行在 Python shell 中运行时有效,返回一个单项查询集,其中包含订单 #11208 和 #11234 以及所有其他可能已从中拆分的订单。
当然,我们不能在那里对订单号进行硬编码。我们需要引用我们正在查看其详细信息页面的订单实例的ordernumber 字段。像这样:
kwargs["queryset"] = Order.objects.filter(child_orders__ordernumber__exact=?????)
我没有找到替换的有效方法??????参考“当前” Order 实例,我已经深入挖掘了。 self 内 formfield_for_foreignkey 指的是 ModelAdmin 实例,虽然它确实有一个 model 属性,但它不是订单模型实例(它是一个 ModelBase 引用;self.model() 返回一个实例,但它的 ordernumber 是 None )。
一种解决方案可能是从 request.path (/admin/orders/order/11234/) 中提取订单号,但这真的很难看。我真的希望有更好的方法。
【问题讨论】:
标签: django django-admin modeladmin