Использование django2.0.2 python3.4 drf
пропустить детали ex) meta, password, postcontent ...
models.py
class Userinfo(models.Model)
usersuid = BigAutoField(db_column='UserUID', primary_key=True)
username = models.CharField(db_column='UserName')
class Postinfo(models.Model)
postuid = BigAutoField(db_column='PostUID', primary_key=True)
useruid = models.ForeignKey(
'Userinfo', db_column='UserUID', on_delete=models.CASCADE)
class Postreply(models.Model)
replyuid = BigAutoField(db_column='ReplyUID', primary_key=True)
useruid = models.ForeignKey(
'Userinfo', db_column='UserUID', on_delete=models.CASCADE)
postuid = models.ForeignKey(
'Postinfo', db_column='PostUID', on_delete=models.CASCADE)
replystep = models.IntegerField(db_column='ReplyStep')
replydepth = models.IntegerField(db_column='ReplyDepth')
replystep is Orderответа на сообщения
replydepth is Порядок ответов на ответы (например, @username на коментарии в Facebook)
myviews.py
usermodel = Userinfo.objects.get(useruid=request.get("useruid"))
usermodel.postreply_set.all().values('replyuid','postuid','useruid','replystep','replydeth').annotate(re_replycount=('???'))
re_replycount похож на этот запрос
SELECT COUNT(*) FROM PostReply WHERE PostUID = t1.PostUID AND ReplyStep = t1.ReplyStep AND ReplyDepth > 0
я пытался
Postreply.objects.filter((Q(postuid=F('postuid')) & Q(replystep=F("replystep")) & Q(replydepth__gt=0))).count(), output_field=IntegerField())
этот набор запросов в '???'
, но возвращал странный результат
Таблица постреплицирования
replyuid | useruid | postuid | replystep | replydepth
1 1 1 0 0
2 1 1 1 0
3 2 1 0 1
4 1 1 0 2
usermodel.postreply_set.filter(replydepth=0).values('replyuid','postuid','useruid','replystep','replydeth').annotate(re_replycount=Sum(Case(
When(Q(postuid=F('postuid')) & Q(replystep=F("replystep")) & Q(replydepth__gt=0), then=1),
output_field=IntegerField(),
)))
если useruid = 1 нужен результат
{replyuid :1 ,useruid:1,postuid:1,replystep:0,replydepth:0,re_replycount:2}
но я получаю
{replyuid :1 ,useruid:1,postuid:1,replystep:0,replydepth:0,re_replycount:null}
re_replycount равно нулю
я хочу получить тот же результат значения этого sql
SELECT 0 AS ReplyUIDSort, t1.ReplyUID, t1.PostUID, t1.UserUID, t1.Content,
t1.ReplyStep, t1.ReplyDepth, t1.RegisterDate, t2.Content AS PostContent, (SELECT COUNT(*) FROM PostReply WHERE PostUID = t1.PostUID AND ReplyStep = t1.ReplyStep AND ReplyDepth > 0) AS Re_ReplyCount
FROM WorryReply t1
INNER JOIN WorryInfo t2
ON t1.WorryUID = t2.WorryUID
WHERE t1.UserUID = i_UserUID
AND t1.ReplyDepth = 0
django queryset
userinfomodel.postreply_set.filter(replydepth=0).select_related('postuid').annotate(postcontent=F("postuid_id__content"), re_replycount=Sum(Case(
When(Q(postuid=F('postuid')) & Q(replyref=F(
"replystep")) & Q(replydepth__gt=0), then=1),
output_field=IntegerField(),
default=Value(0)
))).values('ReplyUID','PostUID','UserUID','Content', 'ReplyStep','ReplyDepth', 'RegisterDate','postcontent','re_replycount')
и мой queryset.query
SELECT 'postreply'.'ReplyUID', 'postreply'.'PostUID', 'postreply'.'UserUID',
'postreply'.'Content', 'postreply'.'ReplyStep', 'postreply'.'ReplyDepth', 'postreply'.'RegisterDate', 'postinfo'.'Content' AS 'postcontent', SUM(CASE WHEN ('postreply'.'PostUID' = ('postreply'.'PostUI
D') AND 'postreply'.'ReplyStep' = ('postreply'.'ReplyStep') AND 'postreply'.'Re
plyDepth' > 0) THEN 1 ELSE 0 END) AS 're_replycount' FROM 'postreply' INNER JOIN 's
toryinfo' ON ('postreply'.'PostUID' = 'postinfo'.'PostUID') WHERE ('postrep
ly'.'UserUID' = 243 AND 'postreply'.'ReplyDepth' = 0) GROUP BY 'postreply'.'Rep
lyUID', 'postinfo'.'Content' ORDER BY NULL