繁体   English   中英

预取一对多关系django ORM

[英]Prefetching One-to-Many Relationship django ORM

我现在正在开发API函数,该函数将返回用户朋友列表以及该用户照片的所有引用。 (尽管我只需要按ord排序的引用)

下面是带有外键的我的模型。

class Personimage(models.Model):
    photo_uuid = models.CharField(db_column='photoUUID', max_length=100, blank=True,
                                 primary_key=True, default='')
    user_id = models.ForeignKey('Member', db_column='userID', on_delete=models.CASCADE, blank=True,
                               null=True)
    ord = models.IntegerField(db_column='ord', blank=True, null=True)
    reference = models.CharField(db_column='reference', max_length=200, blank=True, null=True)

class Member(AbstractBaseUser):
    user_id = models.CharField(db_column='userID')

class Friends(models.Model):
    id = models.IntegerField(db_column='id', primary_key=True, blank=False, null=False)
    puser = models.ForeignKey('Member', on_delete=models.CASCADE, db_column='puser')
    suser = models.ForeignKey('Member', on_delete=models.CASCADE, db_column='suser',
                              related_name='secondary_friend')

到目前为止,我能够做到这一点:

friends = Friend.objects.filter(puser=cur_user).prefetch_related('suser')

    for r in friends:
        photos = Personimage.objects.filter(user_id=r.suser)
        united.append({'user_id': r.suser.user_id,
                       'name': r.suser.name,
                       'photos': [photo.reference for photo in photos.filter(user_id=r.suser)]})

但是您可以对图片进行慢速处理,因为它必须为好友列表中的每个用户调用Personimage表。 我知道有一种方法可以使用prefetch_related或将其与其他方法组合使用,但是我无法在网上或实验中的任何地方找到方法。 我得到的最接近的照片是为朋友中的每个成员只返回一张照片。

将Member模型替换为Member类中的ManyToMany字段“ friends”。 另外,我认为您不需要user_id字段-您具有默认的'id'字段,不需要别名(Django会为您提供)。

class Member(AbstractBaseUser):
  friends = models.ManyToManyField('self')

然后以所需的形式获取数据:

friends = Member.objects.get(pk=cur_user).friend.all().prefetch_related('personimage_set')
united = []
for friend in friends:
  united.append({'user_id': friend.id, 
                 'name': friend.name, 
                 'photos': list(friend.personimage_set.values_list('reference', flat=True))})

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM