Как объединить несколько моделей как один к одному, так и один ко многим с помощью 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')
Ознакомьтесь с этой статьей