2017-02-27 85 views
0

我正在开发一个API函数,它将返回用户朋友的列表以及该用户照片的所有参考。 (虽然我只需要按ord排序的参考)预取一对多关系django ORM

下面是我的模型与外键。

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或其他一些组合来做到这一点,但我无法找到如何在网上或在我的实验中做到这一点。我得到的最接近的只是为朋友中的每个成员返回一张照片。

+0

你为什么要建立友模式?将Member = models.ManyToManyField('self')添加到Member类会不会更容易? –

+0

@RomanB。我创建了它,因为我认为我需要多对多关系的连接表。我对使用Django ORM –

+0

相当陌生,并且为什么要为每个字段使用db_column?你是否在Django中控制/创建表格,或者你只是试图在Django中为现有表格创建一个API?您是否正在寻找解决方案而无需更改表格,或者您可以修改它们以使其更好地工作? –

回答

0

用成员类中的ManyToMany字段'friends'替换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))})