Как получить все связанные объекты в моделях django ForeignKey и OneToOneField
Я использую Django 1.9. У меня есть следующие модели Django:
@python_2_unicode_compatible
class Projects(models.Model):
index = models.IntegerField(blank=True,default=1)
year = models.CharField(max_length=255, blank=True)
title = models.CharField(max_length=255, blank=True)
description = models.TextField(blank=True)
def __str__(self):
return '%s, %s, %s, %s' %(self.index,self.year,self.title,
self.description)
@python_2_unicode_compatible
class Awards(models.Model):
title = models.CharField(max_length=255, blank=True)
def __str__(self):
return '%s' %( self.title)
@python_2_unicode_compatible
class Images(models.Model):
projects = models.ForeignKey(Projects,null=True,blank=True, related_name='images_projects')
awards = models.OneToOneField(Awards,null=True,blank=True,related_name='images_awards')
title = models.CharField(max_length=255, blank=True)
file = models.ImageField(upload_to='upload_images/')
uploaded_at = models.DateTimeField(auto_now_add=True)
def __str__(self):
return '%s, %s' %(self.file, self.pk)
1) Я пытаюсь получить все объекты модели. Проекты и объекты модели. Изображения, связанные с моделью. Проекты. Projects.objects.all().select_related('images_projects')
В результате я получаю только объекты моделей проектов.
2) Я хочу получить все объекты модели Награды и связанные поля в изображениях.
Awards.objects.all().prefetch_related('images_awards')
В результате я получаю только все поля модели Award.
Как собрать связанные поля вместе со всеми объектами основной модели в 2 моих случаях?
1 ответ
select_related
а также prefetch_related
являются усилителями производительности, которые извлекают связанные объекты для текущего поиска. Запрос возвращает соответствующие объекты (в основном) для поиска, а затем связанные объекты выбираются вместе;
Вам все еще нужно использовать обычный синтаксис для доступа к связанному объекту в Python.
например
for p in Projects.objects.all().select_related('images_projects'):
print(p.images_projects)
Для доступа к базе данных не будет никаких поездок p.images_projects
так как он уже был доставлен вместе с project
,