Как получить все связанные объекты в моделях 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,

Другие вопросы по тегам