Как объединить несколько моделей как один к одному, так и один ко многим с помощью select_related?

у меня есть несколько моделей, а именно

class Alpha(models.Model):
    name = models.CharField()

class XXX(models.Model):
    owner = models.ForeignKey(Alpha)

class YYY(models.Model):
    name = models.OneToOneField(Alpha)

Теперь, выполняя select_related следующим образом

test = Alpha.objects.filter(id=pk).select_related('XXX')

Это дает мне Invalid field name(s) given in select_related, choices are YYY

Я понимаю, что YYY находится в OneToOne, поэтому он отображается - но есть ли способ получить XXX также? Или я должен использовать "prefetch_related". Но я не хочу использовать prefetch, так как он делает медленные запросы, а между тем у меня 7 моделей, которые должны быть select_related :(

)

Для достижения этой цели можно использовать prefetch_related. Также добавьте related_name в поля внешнего ключа для ссылок.

class Alpha(models.Model):
    name = models.CharField()

class XXX(models.Model):
    owner = models.ForeignKey(Alpha, related_name='xxx')

class YYY(models.Model):
    name = models.OneToOneField(Alpha, related_name='yyy')

Alpha.objects.filter(id=pk).prefetch_related('xxx', 'yyy')

Вы можете использовать select_related при движении в направлении модели 1. Например, XXX.objects.all().select_related('alpha')

Но когда вы переходите от 1 к многим, вы должны использовать prefetch_related.

so Alpha.objects.all().prefetch_related('xxx')

Ознакомьтесь с этой статьей

Вернуться на верх