从 "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()
考虑以下模型:
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()