Django:查询M2M字段并计算发生次数的最佳方法

问题描述 投票:0回答:1
class Edge(BaseInfo):
source = models.ForeignKey('Node', on_delete=models.CASCADE,related_name="is_source")
target = models.ForeignKey('Node', on_delete=models.CASCADE,related_name="is_target")

def __str__(self):
    return '%s' % (self.label)

class Meta:
    unique_together = ('source','target','label','notes')


class Node(BaseInfo):
item_type_list = [('profile','Profile'),
                ('page','Page'),
                ('group','Group'),
                ('post','Post'),
                ('phone','Phone'),
                ('website','Website'),
                ('email','Email'),
                ('varia','Varia')
]

item_type = models.CharField(max_length=200,choices=item_type_list,blank = True,null=True)
firstname = models.CharField(max_length=200,blank = True, null=True)
lastname = models.CharField(max_length=200,blank = True,null=True)
identified = models.BooleanField(blank=True,null=True,default=False)
username = models.CharField(max_length=200, blank=True, null=True)
uid = models.CharField(max_length=200,blank=True,null=True)
url = models.CharField(max_length=2000,blank=True,null=True)   
edges = models.ManyToManyField('self', through='Edge',blank = True)

我有一个模型节点(在这种情况下是soc媒体配置文件-item_type),它与其他节点(在这种情况下是帖子)有关系。个人资料可以是帖子的作者。其他个人资料可以顶或评论该帖子。

问题:获得所有喜欢或评论anothes个人资料的帖子以及这些喜欢/评论数的最有效方法是什么?

        print(Edge.objects.filter(Q(label="Liked")|Q(label="Commented"),q).values("source").annotate(c=Count('source')))

[将我带到某个地方,但我有(id)的值,我想将对象传递到模板,而不是.get()再次将所有配置文件传递给我...

结果:

提前感谢

python django django-models django-queryset
1个回答
0
投票

我最终遍历了查询集并在字典中添加了我想要的对象,如果该对象已经在字典中,则我将计数+1并将该关系添加到嵌套列表中。这感觉不对,但现在可以使用。

  posts = Edge.objects.filter(source = self,target__item_type='post',label='Author')
    if posts:
        q = Q()
        for post in posts:
            q = q | Q(target=post.target)
        contributors = Edge.objects.filter(Q(label="Liked")|Q(label="Commented"),q)

        if contributors:
            for i in contributors:
                if i.source.uid in results:
                    if i.label in results[i.source.uid]['relation']:
                        pass
                    else:         
                        results[i.source.uid]["relation"].append(i.label)
                    if 'post' in results[i.source.uid]:
                        results[i.source.uid]['post'].append(i.target)
                    else:
                        results[i.source.uid]['post']=[i.target]
                else:
                    results[i.source.uid] = {'profile' : i.source , 'relation':[i.label],'post':[i.target]}  
© www.soinside.com 2019 - 2024. All rights reserved.