【发布时间】:2017-07-18 17:04:21
【问题描述】:
我现在正在开发一个 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 或它的某种组合和其他东西来做到这一点,但我无法在网上或我的实验中找到如何做到这一点。我得到的最接近的结果是只为朋友中的每个成员返回一张照片。
【问题讨论】:
-
您为什么要创建 Friends 模型?将friends = models.ManyToManyField('self') 添加到Member 类不是更容易吗?
-
@RomanB。我创建它是因为我认为我需要多对多关系的连接表。我对使用 Django ORM 很陌生
-
为什么每个字段都使用 db_column?您是在 Django 中控制/创建表,还是只是想在 Django 中为现有表创建 API?您是否正在寻找无需更改表格的解决方案,或者您可以修改它们以使其更好地工作?
-
@RomanB。再次,当涉及到 Django 时,这就是无知,我只是为现有表创建一个 API,但可以完全控制修改它们以及所有这些。因此,如果有更好的方法,我愿意接受。
标签: python django database orm prefetch