首页 > 解决方案 > Django从查询集中的外键获取外键

问题描述

我正在尝试在 1 个查询中获取外键的外键,但我无法使其工作

楷模

class Storage(models.Model):
    name = models.CharField(max_length=200,
                            null=False,
                            blank=False,
                            unique=True)

class Freezer(models.Model):
    name = models.CharField(max_length=200,
                            null=False,
                            blank=False,
                            unique=True)
    storage = models.ForeignKey(Storage,
                                models.CASCADE,
                                blank=True,
                                null=True,
                                related_name='freezer')

class Rack(models.Model):
    name = models.CharField(max_length=200,
                            null=False,
                            blank=False,
                            unique=True)
    freezer = models.ForeignKey(Freezer,
                                models.CASCADE,
                                blank=True,
                                null=True,
                                related_name='rack')

代码

当我得到所有冰柜时,这很有效

display_text = ", ".join([
    "<a href={}>{}</a>".format(
        reverse(
            'admin:{}_{}_change'.format("admin",
                                        "freezer"),
            args=(items.pk, )), items)
    for items in obj.freezer.all()
])
if display_text:
    return mark_safe(display_text)

但我无法得到这个查询的机架

display_text = ", ".join([
    "<a href={}>{}</a>".format(
        reverse(
            'admin:{}_{}_change'.format("admin",
                                        "rack"),
            args=(items.pk, )), items)
    for items in obj.freezer.rack.all()
])
if display_text:
    return mark_safe(display_text)

有什么建议对不起我是新人吗?

标签: pythondjangodjango-models

解决方案


通过这种计算,您应该从您需要的类开始,即 Rack。

... for items in Rack.objects.filter(freezer__storage=obj)

(请注意,通过将related_names 设置为单数“rack”和“freezer”,您使事情变得比需要的更混乱。如果您必须设置它们,我不建议这样做,您至少应该使用复数名称。)


推荐阅读