gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:32:45 24 4
gpt4 key购买 nike

我有一个类似于以下的双向外来关系

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 的选择限制为只有其 parent 是其自身的 child ?我试过了

class Parent(models.Model):
name = models.CharField(max_length=255)
favoritechild = models.ForeignKey("Child", blank=True, null=True, limit_choices_to = {"myparent": "self"})

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

最佳答案

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

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

使用可调用(函数或类方法或任何可调用对象)似乎更有希望。但是,如何从 HttpRequest 对象访问必要信息的问题仍然存在。使用 thread local storage可能是一个解决方案。

<强>2。更新:这对我有用:

我创建了上面链接中描述的中间件。它从请求的 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,
},
)

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

关于python - 如何仅在 django 中将外键选择限制为相关对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/232435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com