从 "one" 端有效访问 "many" 端

Accessing the "many" side from the "one" side effectively

考虑以下模型:

class ManySide(django.db.models.Model):
    one_side = models.ForeignKey(
        to=OneSide, on_delete=models.PROTECT, related_name="related_one_side"
    )

class OneSide(django.db.models:model):
    # not containing any field relevant here

    def many_side_elements(self):
        pass # ?

我应该在方法 many_side_elements 中包含什么,以便从 OneSide 模型实例调用它会列出 ManySide 个元素的查询集?

Official docs 暗示给定 o 是一个 OneSide 实例,o.many_side_set.all() 应该可以工作,但 returns shell 中的一个错误。

我目前的解决方案如下:

from django.apps import apps

[...]

def many_side_elements(self):
    ManySideModel = apps.get_model('<app_name_here>', 'ManySide')

    val = ManySideModel.objects.filter(one_side=self)

但我担心它无效,因为它需要导入其他模型。实际上它在我的项目中导致了循环依赖错误消息,因此 get_model 用法。

有没有更好的方法?或者 xy_set 应该首先起作用?那我做错了什么?

如果您使用相关名称创建模型字段,相关名称将覆盖 _set 查询集。

你的情况 o.related_one_side.all() 无需其他定义即可工作。

参见:https://docs.djangoproject.com/en/4.0/topics/db/queries/#following-relationships-backward

You can override the FOO_set name by setting the related_name parameter in the ForeignKey definition. For example, if the Entry model was altered to blog = ForeignKey(Blog, on_delete=models.CASCADE, related_name='entries'), the above example code would look like this: b.entries.all()