2017-02-27 82 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))})