如何在Django中有效地从1到1的相关表中获取相关数据?

kqqjbcuj  于 2023-05-19  发布在  Go
关注(0)|答案(1)|浏览(226)

我有以下模型。(我只包括实际完整定义的一部分,因为其余部分与问题无关。

class Event(models.Model):
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    created_at = models.DateTimeField(auto_now_add=True)
    last_updated = models.DateTimeField()
    title = models.CharField(max_length=255)
    description = models.TextField(blank=True, null=True)

class Translation(models.Model):
    event = models.ForeignKey(Event, related_name="translation_event", on_delete=models.CASCADE, null=True)
    title = models.CharField(max_length=255)
    description = models.TextField(null=True, blank=True)

我想在Event表上创建一个查询集,然后将其与转换后的数据连接起来。换句话说,我希望在Event表和Translation表之间有一个左外连接。
如果我在Event表上有一个查询集(名为queryset),根据我看到的一些示例以及文档的理解,我应该能够执行以下操作:

queryset = queryset.select_related("translation_event")
for event_obj in queryset:
    print(event_obj.title)
    print(event_obj.translation_event.title)

然而,当Django到达for event_obj in queryset:行时,它抛出一个异常:
django.core.exceptions.FieldError:select_related中给出的字段名无效:'translation_event'。
(It然后列出一些有效的字段名称,即事件表中与其他表具有外键关系的字段。)
看起来好像select_related允许从Event表到其他表,但不允许外键在第二个表中的另一个方向--尽管它应该这样做。
任何帮助将不胜感激。

cclgggtu

cclgggtu1#

我希望我能正确理解你:你在寻找反向查找,对吗?
TranslationEvent很容易。

trnsl = Translation.objects.all().first()
print(trnsl.translation_event)

另一种方法称为反向查找。一个Translation属于一个特定的Event。但是一个特定的Event可以有一组Translation s。我不知道这对您的用例是否有意义,但这就是ForeignKey的逻辑。另一种选择是OneToOneFieldmore)。短语“has a set of”已经将您引导到反向查找的python语法。这样做:

evnt = Event.objects.all().first()  # grab an event
for related_trnsl in evnt.translation_set.all():
    print(related_trnsl)

你会发现更多有关查找here。只要在网站上搜索“_set”,你就会更快地找到它。

相关问题