0

我有一个订单模型:

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 中。

做这个的最好方式是什么?

4

3 回答 3

0

我又看了看这个,它似乎正在工作,虽然它看起来有点像黑客!问题是请求中似乎不存在订单号,所以我正在解析请求的 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 字符串为整数的行适用于管理员的更改订单页面,但不适用于订单页面概述,因此我添加了 try/except。欢迎任何建议/改进!

于 2016-08-08T22:08:19.327 回答
0

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

您将获得相关模型的数字、文本描述(来自str)和一个不错的弹出框,用于打开相关模型的管理页面实例。

您也可以使用 list_select_related = True 来获得与现在相同的行为,但查询数量减少了几个数量级。

于 2016-08-08T22:16:11.097 回答
0

如果您使用的是 Django Admin,则可以覆盖类formfield_for_foreignkey上的方法,ModelAdmin以基于 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

于 2016-04-22T14:30:01.717 回答