Django从对象列表中获取“子”对象

时间:2016-05-10 12:58:15

标签: django django-models django-views

我一直在反对从对象列表中检索“子”对象的问题:

class BusinessLike(models.Model):
    user = models.ForeignKey(AppUser, related_name='user_business_likes')
    business = models.ForeignKey(Business, related_name='business_likes')
    class Meta:
        unique_together = (('user', 'business'),)

如何在'Business'中为每个'BusinessLike'对象获取app_user.user_businesses_likes个对象(不循环列表并使用business_like.business创建新列表)?

2 个答案:

答案 0 :(得分:1)

您可以使用valuesvalues_list

businesses = BusinessLike.objects.values('business')
businesses = BusinessLike.objects.values_list('business', flat=True)

但是,这不会给你一个对象列表,你只能得到一个外键ID列表。

关于values and value_list的Django doc。

如果您希望每次执行business_like.business时都避免进行其他查询,则可以使用select_related

business_likes = BusinessLike.objects.select_related('business')

在这种情况下,当你循环每个BusinessLike对象并执行business_like.business时,django不再加入数据库,但它已经缓存在内存中。

Django doc about select_related

答案 1 :(得分:1)

如果您在视图中执行此操作,您可能会发现从Business模型开始创建新的查询集会更容易。

businesses = Business.objects.filter(business_likes__user=app_user)

我不确定您是否需要像这样创建BusinessLike模型。如果您愿意,可以向AppUser模型(或Business模型)添加多对多字段。

class AppUser(models.Model):
    business_likes = models.ManyToManyField(Business)

Django将负责创建中间表,然后您可以执行以下查询:

businesses = app_user.business_likes.all()