是否可以使用django orm按字段名分组?
我有两种型号:是否可以使用django orm按字段名分组?,django,django-rest-framework,django-orm,Django,Django Rest Framework,Django Orm,我有两种型号: class ExampleOne(models.Model): #一些领域 课堂示例二(models.Model): 示例_one=models.ForeignKey( “App.ExampleOne”, 在_delete=models.CASCADE上, 相关的_name=“示例”, ) 字段_one=。。。 字段二=。。。 我为我的端点创建了以下视图: 类MyViewSet(ViewSet.ViewSet): def列表(自我、请求): queryset=ExampleOn
class ExampleOne(models.Model):
#一些领域
课堂示例二(models.Model):
示例_one=models.ForeignKey(
“App.ExampleOne”,
在_delete=models.CASCADE上,
相关的_name=“示例”,
)
字段_one=。。。
字段二=。。。
我为我的端点创建了以下视图:
类MyViewSet(ViewSet.ViewSet):
def列表(自我、请求):
queryset=ExampleOne.objects.all().values(
“身份证”,
“示例\字段\一个”,
“示例\u字段\u二”,
)
返回响应({“数据”:queryset})
返回此文件:
{
“数据”:[
{
“id”:1,
“示例id”:1,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
},
{
{
“id”:1,
“示例id”:2,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
},
{
“id”:2,
“示例id”:3,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
}
但是我想要一种按照第一个模型分组的方式。这是可能的吗?我想要这样的方式:
{
“数据”:[
{
"1": [
{
“示例id”:1,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
},
{
“示例id”:2,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
},
],
"2": [
{
“示例id”:3,
“示例”字段“一”:foo,
“示例\u字段\u二”:条形图,
},
]
}
}
这是可能的?我找到的所有关于分组的信息都涉及到值(count、sum等)。但我只想按一个字段(model one id)进行分组。使用Django ORM没有直接的方法 使用原始SQL 一种选择是使用原始SQL查询,但如果您指定要使用ORM实现此目的,则可以使用offtopic 修改
query.group\u by
属性
另一种方法是修改给定查询集的query
的groupby
属性(这将在groupby
SQL语句中大致转换):
这是不推荐的,因为它不是一个文档化的API,并且它可能(将?)在您的queryset上做不需要的事情
自己构建dict
另一种选择是不直接使用ORM:
group_by_values = MyModel.objects.values_list(
'group_by_field', flat=True
).distinct() # This is a list of all existing values for group_by_field
result = {
value: MyModel.objects.filter(group_by_field=value)
for value in group_by_values
}
第三方选择权
最后一个选项是使用第三方库,如
仅处理模板显示时(与您无关)
{%regroup%}
模板标记非常适合于此。请参阅。您可以这样做
class ExampleOne(models.Model):
# some fields
class ExampleTwo(models.Model):
example_one = models.ForeignKey(
"App.ExampleOne",
on_delete=models.CASCADE,
related_name="examples",
)
field_one = ManyToManyField(YourModel, related_name="*")
field_two = ManyToManyField(YourModel, related_name="*")
或者可以使用forloop
data = []
for i in yourmodel:
dicts = {}
dicts["id"] = i.id
dicts["your_data"] = [{i.model_1}]
data.append(dicts)
return Response({"data": data})
您可以尝试以下方法:
queryset_data={}
for e in queryset:
if e.value('id') not in new_data :
new_data[e.value('id')]=[e.value("examples__id","examples__field_one","examples__field_two")]
else :
new_data[e.value('id')].append(e.value("examples__id","examples__field_one","examples__field_two"))
return Response({"data": queryset_data})
不,我用的是drf。好的,我已经相应地编辑了我的答案。嘿,勒米诺,谢谢。清晰的工作很好。
queryset_data={}
for e in queryset:
if e.value('id') not in new_data :
new_data[e.value('id')]=[e.value("examples__id","examples__field_one","examples__field_two")]
else :
new_data[e.value('id')].append(e.value("examples__id","examples__field_one","examples__field_two"))
return Response({"data": queryset_data})