我一直在反对从对象列表中检索“子”对象的问题:
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创建新列表)?
答案 0 :(得分:1)
您可以使用values
或values_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不再加入数据库,但它已经缓存在内存中。
答案 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()