当前位置: 首页 > 面试题库 >

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

澹台华晖
2023-03-14
问题内容

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

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,
    },
)

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



 类似资料:
  • 问题内容: 概述:我试图表示数据库中几种类型的实体,它们具有许多共同的基本字段,然后每个实体都具有一些其他字段,这些字段不与其他类型的实体共享。工作流通常会涉及将实体一起列出,因此我决定要有一个带有其公共字段的表,然后每个实体都将具有自己的表及其附加字段。 要实现:所有实体都拥有一个共同的领域“ tatus”;但是,某些实体将仅支持所有可能状态的子集。我还希望每种类型的实体都强制使用其状态子集。最

  • 我正在使用日历视图来选择产品交付日期。我想在日历视图中仅显示当前日期的一个完整月份? 比如说: 今天的日期:2019年4月4日-日历视图应仅显示至2019年5月31日,不应显示上个月。 另一个例子:如果今天的日期是:2019年8月15日——日历视图应该只显示到2019年9月30日,而不应该显示上个月。 这可能吗?如果是这样的话,当我点击箭头时,如何显示默认日历视图是显示所有年份的正负?

  • 问题内容: 我使用的选择标记的格式允许多次选择,但我希望选择的最大数量为10。使用JavaScript或jquery是否可以? 提前致谢! 问题答案: 这是供您使用的一些完整代码…一定要喜欢Google AJAX API Playground :-) 编辑1: 注意:这只允许您选择5,因为我不想复制/粘贴另外10个选项:-) ​

  • 问题内容: 我有这张桌子: 假设我有500行,我想为每个feed_id选择3个条目吗?和50作为总限制。 怎么写这个SQL? 问题答案: 使用: 还不清楚要返回什么的详细信息-表中的所有行,或仅是feedid。

  • 问题内容: 我想用django管理面板实现一个非常简单的功能,但到目前为止,我找不到正确的方法来实现这一目标: 模型 管理员 如何在作者列表概述中的每个项目(作者)上添加超链接,该超链接链接到显示特定作者的所有书籍的视图?例如: JK罗琳(书籍) JRR托尔金(书籍) 书籍是指向显示所有作者书籍的网站的超链接。 问题答案: 您正在寻找ModelAdmin.list_filter。 设置list_f

  • 我很难理解Django ORM中的和。我有以下型号: 现在我的views.py: 但是现在,每次for循环迭代时,它都会访问数据库3次。我试图提高时间复杂度——现在是3N 2,N是城市的数量,但是我不能理解select_related和prefetch_related。 你能给我一个例子,我该如何改进它,使它不会在for循环中命中数据库3次吗?