【问题标题】:Django manytomany fields are not included in api callapi调用中不包含Django manytomany字段
【发布时间】:2020-07-08 16:10:29
【问题描述】:

型号:

class Light(models.Model):
    name = models.CharField(max_length=255, default="neues Licht", null=False, blank=False)
    percentage = models.IntegerField(default=0, null=False, blank=False)

    def __str__(self):
        return self.name
    
class LightGroup(models.Model):
    name = models.CharField(max_length=255, default="neue Gruppe", null=False, blank=False)
    lights = models.ManyToManyField(Light,related_name='groups')

    def __str__(self):
        return self.name 

观看次数:

def get(self, request, *args, **kwargs):
        lights = Light.objects.all().values()
        lights_list = list(lights)
        return JsonResponse(lights_list, safe=False) 

结果:

[{"id": 2, "name": "light 1", "percentage": 3}] 

如何在 jsonresponse 中包含组?

在管理面板中查看群组时会显示连接。 但即使我尝试从 LightGroup 模型中读取,关联的灯光也不会显示。

编辑:

当尝试这样的事情时:

def get(self, request, *args, **kwargs):
        obj = Light.objects.all()
        lights = obj.groups.all().values()
        lights_list = list(lights)
        return JsonResponse(lights_list, safe=False)

我得到:AttributeError - 'QuerySet' 对象没有属性 'groups'

编辑2:解决方案:

我使用 Manjit Kumars 的答案进入小组,并能够以我想要的形式获取数据:

    def get(self, request, *args, **kwargs):
        lights_list =[]
        lights = Light.objects.all().values()

        lights_obj = Light.objects.all()
        for light_obj, light in zip(lights_obj, lights):
            light_groups = light_obj.groups.all().values()
            light["groups"] = list(light_groups)
            lights_list.append(light)
        return JsonResponse(lights_list, safe=False)

json

【问题讨论】:

  • 为什么使用 .values() 不能直接返回对象?你在使用 django-rest-framework 吗?
  • 您会查询 LightGroup 模型而不是 Light 模型吗?
  • 我没有使用 django rest 框架,JsonResponse 无法序列化对象。
  • 当我查询 LightGroup 模型时,我只得到“id”和“name”。

标签: python django django-models jsonresponse


【解决方案1】:

Model.objects.all() 返回一个包含模型所有匹配对象的查询集。

你想做的是:

def get(self, request, *args, **kwargs):
    lights_list = []
    lights = Light.objects.all()
    for light in lights:
        light_groups = light.groups.all().values()
        lights_list = list(light_groups)
    return JsonResponse(lights_list, safe=False)

或者,您可以查看 django-rest-framework 和 ModelViewSets,这让您可以使用 API 做更多事情。

【讨论】:

  • 我能够通过您的输入解决它。谢谢!
猜你喜欢
  • 2013-04-08
  • 2016-01-02
  • 1970-01-01
  • 2018-01-25
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
相关资源
最近更新 更多