2016-04-22 42 views
0

我有一个订单模式: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中。

这样做的最好方法是什么?

+1

如果配置文件是固定的,它听起来好像根本不应该可编辑。您可以将其设为[只读字段](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

+0

您使用的是django管理员吗? –

+0

是的,这是与django管理站点 – James

回答

0

如果您使用的是Django管理,您可以覆盖的方法formfield_for_foreignkeyModelAdmin类修改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) 

引用文档:https://docs.djangoproject.com/en/1.9/ref/contrib/admin/#django.contrib.admin.ModelAdmin.formfield_for_foreignkey

+0

嗯,我试着将上面的代码添加到我的OrderAdmin类,但这只是导致504网关超时... – James

+0

虽然它的顺序='12345'行,尽管附加了错误的配置文件 – James

+0

您可以禁用调试,查看引发504的异常是否被抛出? –

0

我把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字符串的整数线适用于管理员的变更单页,但对于订购页面概述没有工作,所以我增加了尝试/除外。任何建议/改进的欢迎!

0

我从上下文中假设您指的是Django Admin页面上的显示。如果设置 raw_id_fields = {“my_foreign_key”}

你会得到(从STR)和一个不错的弹出框中输入一个数字,相关模型的文字说明,打开管理页面的一个实例为您相关的模型。

您也可以使用 list_select_related = True 以获得与您现在具有相同的行为,但是具有较低数量的查询数量级。