Django的:限制models.ForeignKey结果
问题描述:
我有一个订单模式:Django的:限制models.ForeignKey结果
class Order(models.Model):
profile = models.ForeignKey(Profile, null=True, blank=True)
它返回的所有可能的配置文件的命令,这是没有必要的,因此减慢了管理秩序网页的加载速度。
我希望简单地返回简单地作为下订单的用户的配置文件。我试着将其更改为:
class Order(models.Model):
profile = models.ForeignKey(Profile, null=True, blank=True, limit_choices_to={'order': 99999})
它返回订单号99999正确的配置文件,但我怎么能得到这个动态。 Order模型不知道“self”,但订单号包含在URL中。
这样做的最好方法是什么?
答
如果您使用的是Django管理,您可以覆盖的方法formfield_for_foreignkey
您ModelAdmin
类修改dinamically基于例如GET参数的配置文件字段的查询集(因为你有方法内访问request
。
看一看该文档这个例子中(适用于您的情况):
class MyModelAdmin(admin.ModelAdmin):
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "profile":
# You can get the order number from the GET parameter:
# order = request.GET.get('order')
# or a fixed number:
order = '12345'
kwargs["queryset"] = Profile.objects.filter(order=order)
return super(MyModelAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
答
我把ANOT她看着这个,它似乎工作,虽然它似乎有点破解!问题在于订单号似乎不存在于请求中,所以我正在解析请求的URL。我把这个在我的订单管理:
def formfield_for_foreignkey(self, db_field, request, **kwargs):
if db_field.name == "profile":
try:
order = int(filter(str.isdigit, str(request.path_info)))
except:
order = request.GET.get('order')
kwargs["queryset"] = Profile.objects.filter(order=order)
return super(OrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)
,其过滤URL字符串的整数线适用于管理员的变更单页,但对于订购页面概述没有工作,所以我增加了尝试/除外。任何建议/改进的欢迎!
答
我从上下文中假设您指的是Django Admin页面上的显示。如果设置 raw_id_fields = {“my_foreign_key”}
你会得到(从STR)和一个不错的弹出框中输入一个数字,相关模型的文字说明,打开管理页面的一个实例为您相关的模型。
您也可以使用 list_select_related = True 以获得与您现在具有相同的行为,但是具有较低数量的查询数量级。
如果配置文件是固定的,它听起来好像根本不应该可编辑。您可以将其设为[只读字段](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.readonly_fields),并将值设置为[当订单被放置](https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.save_model)。 – Alasdair
您使用的是django管理员吗? –
是的,这是与django管理站点 – James