2017-10-08 121 views
0

我浪费了大量的时间来编写这样的查询。在这里我的模型:Django查询api:复杂子查询

class User(Dealer): 
    pass 


class Post(models.Model): 
    text = models.CharField(max_length=500, default='') 
    date = models.DateTimeField(default=timezone.now) 
    interactions = models.ManyToManyField(User, through='UserPostInteraction', related_name='post_interaction') 


class UserPostInteraction(models.Model): 
    post = models.ForeignKey(Post, related_name='pppost') 
    user = models.ForeignKey(User, related_name='uuuuser') 
    status = models.SmallIntegerField() 


    DISCARD = -1 
    VIEWED = 0 
    LIKED = 1 
    DISLIKED = 2 

什么,我需要:

查询是:(UserPostInteractions where status = LIKED) - (UserPostInteractions where status = DISLIKED) of Post(OuterRef('pk'))

查询:Select all posts order by value of subquery

我被困在错误Subquery returned multiple rows

ELP !!))

+0

您的目标并不那么清晰,试图澄清您的需求。 也 - 你的实际尝试产生的错误将有助于更好地理解你。 –

回答

0

如果我正确理解你的需求,你可以得到你需要这样的QS是什么:

from django.db.models import Case, Sum, When, IntegerField 

posts = Post.objects.values('id', 'text', 'date').annotate(
    rate=Sum(Case(
     When(pppost__status=1, then=1), 
     When(pppost__status=2, then=-1), 
     default=0, 
     output_field=IntegerField() 
    )) 
).order_by('rate') 

在MySQL它在这样的SQL查询中转换:

SELECT 
    `yourapp_post`.`id`, 
    `yourapp_post`.`text`, 
    `yourapp_post`.`date`, 
    SUM(
     CASE 
     WHEN `yourapp_userpostinteraction`.`status` = 1 
      THEN 1 
     WHEN `yourapp_userpostinteraction`.`status` = 2 
      THEN -1 
     ELSE 0 
     END) AS `rate` 
FROM `yourapp_post` 
    LEFT OUTER JOIN `yourapp_userpostinteraction` ON (`yourapp_post`.`id` = `yourapp_userpostinteraction`.`post_id`) 
GROUP BY `yourapp_post`.`id` 
ORDER BY `rate` ASC 
+0

我爱你,非常感谢你。 –