【问题标题】:How to get all related objects in django model ForeignKey and OneToOneField如何在 django 模型 ForeignKey 和 OneToOneField 中获取所有相关对象
【发布时间】:2017-08-06 10:40:12
【问题描述】:

我正在使用 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个案例中,如何将相关字段与主模型的所有对象一起获取?

【问题讨论】:

    标签: python django django-models foreign-keys django-select-related


    【解决方案1】:

    select_relatedprefetch_related性能提升器,它们为当前查找检索相关对象。查询返回相应的对象(主要)用于查找,然后相关对象被一起获取;

    您仍然需要使用常规语法来访问 Python 中的相关对象。

    例如

    for p in Projects.objects.all().select_related('images_projects'):
        print(p.images_projects)
    

    访问p.images_projects 不会进行任何数据库访问,因为它已经与project 一起获取。

    【讨论】:

    • 谢谢!你真的帮了大忙!
    猜你喜欢
    • 2011-01-15
    • 2018-07-30
    • 2018-05-25
    • 2010-11-08
    • 2019-05-30
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2021-10-04
    相关资源
    最近更新 更多