是否可以使用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})