我有两个表(类似于下面的表):
class Piece(models.Model):
cost = models.IntegerField(default=50)
piece = models.CharField(max_length=256)
class User_Piece (models.Model):
user = models.ForeignKey(User)
piece = models.ForeignKey(Piece)
我想做一个返回Piece
中所有项目的查询,但是用登录用户是否拥有该块来注释每一行(因此在User_Piece
中存在一行,其中user是登录用户)。
我试过了:
pieces = Piece.objects.annotate(owned=Count('user_piece__id'))
但它为任何用户拥有的任何部分计数> 0。我不确定user_piece必须具有我想要的指定用户的条件。如果我过滤user__piece__user=user
,那么我不会从Piece获得所有行,只有那些拥有的行。
简单的方法,小心性能:
pk_pices = ( User_Piece
.objects
.filter(user=user)
.distinct()
.values_list( 'id', flat=True)
)
pieces = pieces.objects.filter( id__in = pk_pieces )
另外,请注意您有n:m relation ship,您可以将模型重写为:
class Piece(models.Model):
cost = models.IntegerField(default=50)
piece = models.CharField(max_length=256)
users = models.ManyToManyField(User, through='User_Piece', #<- HERE!
related_name='Pieces') #<- HERE!
并获得用户的作品:
pieces = currentLoggedUser.pieces.all()
你可以使用Exist
子查询包装器:
from django.db.models import Exists, OuterRef
subquery = User_Piece.objects.filter(user=user, piece=OuterRef('pk'))
Piece.objects.annotate(owned=Exists(subquery))
https://docs.djangoproject.com/en/dev/ref/models/expressions/#exists-subqueries