【问题标题】:TypeError at ... <django.db.models.fields.related.ForeignKey> is not JSON serializableTypeError at ... <django.db.models.fields.related.ForeignKey> 不是 JSON 可序列化的
【发布时间】:2019-09-01 03:17:03
【问题描述】:

当我尝试从我的 django api 获取(或 POST 到)浏览器时会抛出这个:

/api/cutarea-fca-use/ 处的类型错误 不是 JSON 可序列化的

那么有什么问题吗?看起来一切正常。

检查并比较这个api和api,效果很好。检查我的正面。

还有我的models.py:

class FcaUse(models.Model): 
    id_fca = models.ForeignKey(Fca, blank=True, null=True, on_delete=models.DO_NOTHING)
    fell_form = models.ForeignKey(ShapeFelling, blank=True, null=True, on_delete=models.DO_NOTHING, verbose_name='kind1')
    fell_type = models.ForeignKey(TypeFelling, blank=True, null=True, on_delete=models.DO_NOTHING, verbose_name='kind2')
    main_type = models.ForeignKey(TypesForestry, blank=True, null=True, on_delete=models.DO_NOTHING, verbose_name='kind3') 
    sortiment = models.ForeignKey(ForestSort, blank=True, null=True, on_delete=models.DO_NOTHING, verbose_name='compos') 
    ed_izm = models.ForeignKey(UnitMeas, blank=True, null=True, on_delete=models.DO_NOTHING, verbose_name='values')
    vol_drew = models.FloatField(blank=True, null=True) 
    fca_res = models.SmallIntegerField(blank=True, null=True)
    vol_res = models.FloatField(blank=True, null=True)
    kind_id_id = models.ForeignKey(ForestKind, blank=True, on_delete=models.DO_NOTHING, verbose_name='group'),

class Meta:
        verbose_name = 'using'
        verbose_name_plural = 'usings'
        managed = True

UPD SERIALIZERS.PY 在这里

class FcaUseSerializer(serializers.ModelSerializer):
    class Meta:
        model = FcaUse
        fields = ('id_fca','fell_form','fell_type','main_type','sortiment','ed_izm','vol_drew',\
        'fca_res','vol_res', 'kind_id_id')

UPD 功能

def cutareause(request):
    if request.method == 'GET':
        queryset = FcaUse.objects.all()
        serializer = FcaUseSerializer (queryset, many= True)
        return JsonResponse(serializer.data, safe=False)

有我的完整曲目:

Internal Server Error: /api/cutarea-fca-use/
Traceback (most recent call last):
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/exception.py", line 35, in inner
    response = get_response(request)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 158, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/core/handlers/base.py", line 156, in _get_response
    response = response.render()
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/django/template/response.py", line 106, in render
    self.content = self.rendered_content
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/response.py", line 72, in rendered_content
    ret = renderer.render(self.data, accepted_media_type, context)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/renderers.py", line 724, in render
    context = self.get_context(data, accepted_media_type, renderer_context)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/renderers.py", line 681, in get_context
    'content': self.get_content(renderer, data, accepted_media_type, renderer_context),
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/renderers.py", line 422, in get_content
    content = renderer.render(data, accepted_media_type, renderer_context)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/renderers.py", line 105, in render
    allow_nan=not self.strict, separators=separators
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/utils/json.py", line 28, in dumps
    return json.dumps(*args, **kwargs)
  File "/usr/lib/python3.5/json/__init__.py", line 237, in dumps
    **kw).encode(obj)
  File "/usr/lib/python3.5/json/encoder.py", line 200, in encode
    chunks = list(chunks)
  File "/usr/lib/python3.5/json/encoder.py", line 429, in _iterencode
    yield from _iterencode_dict(o, _current_indent_level)
  File "/usr/lib/python3.5/json/encoder.py", line 403, in _iterencode_dict
    yield from chunks
  File "/usr/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.5/json/encoder.py", line 403, in _iterencode_dict
    yield from chunks
  File "/usr/lib/python3.5/json/encoder.py", line 324, in _iterencode_list
    yield from chunks
  File "/usr/lib/python3.5/json/encoder.py", line 436, in _iterencode
    o = _default(o)
  File "/home/user/MyProjects/forest-venv/lib/python3.5/site-packages/rest_framework/utils/encoders.py", line 68, in default
    return super(JSONEncoder, self).default(obj)
  File "/usr/lib/python3.5/json/encoder.py", line 179, in default
    raise TypeError(repr(o) + " is not JSON serializable")
TypeError: <django.db.models.fields.related.ForeignKey> is not JSON serializable

【问题讨论】:

  • 您需要向我们展示您的 FcaUseSerializer 代码
  • 你的FcaUseSerializer在哪里?
  • @JPG, Dalvtor exucuse me , 现在这部分代码被添加了。
  • 看起来不错。你能添加完整的错误回溯吗?
  • @JPG 谢谢,因为我不知道错误的原因。是的,添加了引用。

标签: django serialization django-rest-framework request


【解决方案1】:
class FcaUseSerializer(serializers.ModelSerializer):
    id_fca = serializers.RelatedField(many=True)
    fell_form = serializers.RelatedField(many=True) # complete the rest like the first two ones
    class Meta:
        model = FcaUse
        fields = ('id_fca','fell_form','fell_type','main_type','sortiment','ed_izm','vol_drew',\
        'fca_res','vol_res', 'kind_id_id')

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 1970-01-01
  • 2017-10-24
  • 2016-08-02
  • 2019-02-08
  • 2013-05-11
  • 2015-09-19
  • 2014-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多