Django получает внешний ключ от внешнего ключа в queryset - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь получить внешний ключ внешнего ключа в 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)

Есть предложения, извините, я новичок?

1 Ответ

0 голосов
/ 11 июля 2019

При таком расчете вы должны начинать с того класса, который вам нужен, например, Rack.

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

(Обратите внимание, вы сделали вещи намного более запутанными, чем они должны быть, установив related_names в единственном числе "стеллаж" и "морозильник". Если вы должны установить их вообще, что я не рекомендую, вы следует хотя бы использовать множественное число.)

...