如何仅在Django中将外键选择限制为相关对象

我有一种类似于以下的双向外交关系

class Parent(models.Model):

name = models.CharField(max_length=255)

favoritechild = models.ForeignKey("Child", blank=True, null=True)

class Child(models.Model):

name = models.CharField(max_length=255)

myparent = models.ForeignKey(Parent)

我如何将Parent.favoritechild的选择限制为仅其父母为自己的孩子?我试过了

class Parent(models.Model):

name = models.CharField(max_length=255)

favoritechild = models.ForeignKey("Child", blank=True, null=True, limit_choices_to = {"myparent": "self"})

但这会导致管理界面未列出任何子项。

回答:

我刚刚在Django文档中碰到ForeignKey.limit_choices_to。尚不确定这是如何工作的,但在这里可能是正确的事情。

ForeignKey.limit_choices_to允许指定常量,可调用对象或Q对象以限制键的允许选择。常量在这里显然没有用,因为它对所涉及的对象一无所知。

使用可调用(函数或类方法或任何可调用对象)似乎更有希望。但是,仍然存在如何从HttpRequest对象访问必需信息的问题。使用线程本地存储可能是一种解决方案。

这对我有用:

我按照上面的链接中所述创建了一个中间件。它从请求的GET部分提取一个或多个参数,例如“ product = 1”,并将此信息存储在线程本地中。

接下来,模型中有一个类方法,该方法读取线程局部变量并返回ID列表以限制外键字段的选择。

@classmethod

def _product_list(cls):

"""

return a list containing the one product_id contained in the request URL,

or a query containing all valid product_ids if not id present in URL

used to limit the choice of foreign key object to those related to the current product

"""

id = threadlocals.get_current_product()

if id is not None:

return [id]

else:

return Product.objects.all().values('pk').query

重要的是,返回一个包含所有可能的ID的查询(如果未选择任何一个ID),以便正常的管理页面正常运行。

然后将外键字段声明为:

product = models.ForeignKey(

Product,

limit_choices_to={

id__in=BaseModel._product_list,

},

)

问题是您必须通过请求提供信息以限制选择。我在这里看不到访问“自我”的方法。

以上是 如何仅在Django中将外键选择限制为相关对象 的全部内容, 来源链接: utcz.com/qa/422510.html

回到顶部