Django:在一个字段值上连接多个模型,以便在 Django 模板中使用



我在Django 2.0中工作。我有多个共享一个公共字段的模型,并且正在尝试查找相关对象。示意性地,给定模型 Model1 和模型 2,对于 QuerySet 中的每个模型 1,我们希望找到相应的 Model2 对象,以便

Model1.property == Model2.property. 

在此应用程序中,最多将有一个(但可能没有(满足此条件的 Model2。这个查询集将在 Django 模板中用于显示结果。

现在,我对如何解决这个问题有几个想法,但我想知道是否有标准解决方案。

考虑:我知道 Django 模板语言没有内置方法来查找具有特定属性值的对象

想法:

1( 模板中的 for 循环。遍历模型 2,评估模型 2.属性并测试 Model2.property == 模型 1.属性。如果为 true,则存储模型 2。看起来非常笨拙,违背了 Django 模板语言的哲学。

2(在python中处理它。也许将新属性附加到模型 1

Model1.property.model2 = Model2.objects.filter(property=property)

或使用带有"get"的尝试/期望块

3(在查询中处理它。也许使用相关的 Model2 注释检索模型 1 的查询集的结果

4(也许是一个自定义模板标签,可以将此功能添加到Django模板中?

以下是我的模型,供参考:

class ModuleSubscription(models.Model):
subscriber = models.ForeignKey(User, on_delete=models.CASCADE)  # owner of module
module = models.ForeignKey(Module, on_delete=models.CASCADE)  # id of owned module

class ModuleAssignment(models.Model):
delegation = models.ForeignKey(Delegation, on_delete=models.CASCADE)
module = models.ForeignKey(Module, on_delete=models.CASCADE)  # assigned module
access_granted = models.BooleanField(default=False)
module_log = models.ForeignKey(ModuleLog, default=None, on_delete=models.SET_DEFAULT, null=True)

现在,我需要过滤器 ModuleSubscription by subscriber 和 ModuleAssignment by delegate,然后找到生成的 ModuleSubscription.module == ModuleAssignment.module 的位置。原因是,对于每个模块订阅,我需要相应模块分配中的access_granted属性(如果存在(。然后,在模板中,我需要遍历所有筛选的模块订阅并显示关联的ModuleAssignment.access_granted

(除了我的评论(我说的是所有赠款将被公开的表格。可能我误解了delegation在这里应该意味着什么。

# filtering part
modules = ModuleSubscription.objects.filter(subscriber=_s)
grants = ModuleAssignment.objects.filter(delegation=_d, module__in=modules)
# template part
for g in grants:
...

是这样吗?

相关内容

  • 没有找到相关文章

最新更新