簡體   English   中英

類型錯誤在...<django.db.models.fields.related.ForeignKey> 不是 JSON 可序列化的

[英]TypeError at ... <django.db.models.fields.related.ForeignKey> is not JSON serializable

當我嘗試從我的 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

在這里更新 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

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')

TypeError:字段“id”需要一個數字但得到了<django.db.models.fields.related_descriptors< div><div id="text_translate"><p> 我有一個簡單的視圖,用於顯示根據請求數據的用戶類型有條件地過濾的所有當前用戶。</p><p> 模型.py</p><pre> class User(AbstractBaseUser, PermissionsMixin): class SEX(models.TextChoices): MALE = "MALE", "Male" FEMALE = "FEMALE", "Female" class TYPES(models.TextChoices): ... type = models.CharField( _("User Type"), max_length=50, choices=TYPES.choices, default=None, blank=True, null=True) sex = models.CharField( _("Sex Type"), max_length=50, choices=SEX.choices, default=None, blank=True, null=True) email = models.EmailField( _("Your Email"), max_length=254, unique=True, default=None, blank=True, null=True) student_id = models.CharField( _("student id"), unique=True, max_length=10, blank=True, null=True) firstname = models.CharField(max_length=250, blank=False, null=True) middlename = models.CharField(max_length=250, blank=True, null=True) lastname = models.CharField(max_length=250, blank=False, null=True) # grade = models.ForeignKey(Grade, verbose_name=_( # "grade"), on_delete=models.CASCADE, blank=True, null=True) room = models.ForeignKey(Class, verbose_name=_( "class"), on_delete=models.CASCADE, blank=True, null=True) phone = models.CharField( _("phone number"), max_length=13, blank=True, null=True) age = IntegerRangeField(min_value=1, max_value=99, default=25, blank=True, null=True) owns = models.ManyToManyField(School, verbose_name=_( "School_owner"), related_name='Schoolowner', blank=True) workes = models.ForeignKey(School, verbose_name=_( "School_workes"), related_name='Schoolworkes', on_delete=models.SET_NULL, blank=True, null=True) learns = models.ForeignKey(School, verbose_name=_( "School_learns"), related_name='Schoollearns', on_delete=models.SET_NULL, blank=True, null=True) image = models.ImageField( _("photo"), upload_to='user/pp', max_length=None, blank=False, null=True) joined_date = models.DateTimeField( _("created at"), auto_now=False, auto_now_add=True) is_active = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) last_login = models.DateTimeField( _("last login"), auto_now=True, auto_now_add=False)</pre><p> <strong>序列化器.py</strong></p><pre> class MyAccountSerializer(serializers.ModelSerializer): image = serializers.ImageField() class Meta: model = User fields = ['id', 'sex', 'type', 'phone', 'image', 'email', 'student_id', 'firstname', 'middlename', 'lastname', 'image', 'joined_date', 'is_active', 'is_superuser', 'is_staff', 'last_login']</pre><p> <strong>視圖.py</strong></p><pre> class TeacherList(generics.ListAPIView): permission_classes = [IsAuthenticated, ] serializer_class = ListUsersSerializer queryset = User.objects.filter(type=User.TYPES.TEACHER)</pre><p> <em>像這樣的簡單過濾器沒有任何錯誤,但因為我需要根據請求用戶過濾響應</em></p><p>這就是我想用的</p><pre>class TeacherList(generics.ListAPIView): permission_classes = [IsAuthenticated, ] serializer_class = ListUsersSerializer # queryset = User.objects.filter(type=User.TYPES.TEACHER) def get_queryset(self): request = self.request.user if request.type == User.TYPES.OWNER: queryset = User.objects.filter( type=User.TYPES.TEACHER, workes=request.owns) elif request.type in [User.TYPES.STAFF, User.TYPES.DIRECTOR, User.TYPES.VICE_DIR]: queryset = User.objects.filter( type=User.TYPES.TEACHER, workes=request.workes) return queryset</pre><p> <strong>然而,這向我展示了一個如下所示的錯誤:</strong></p><pre> Field 'id' expected a number but got <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x0000019D64AE7D60>.</pre><p> 我懷疑它與我有一個名為 owns 的多對多字段有關,這是我用來在其中一種情況下進行過濾的字段,但不知道為什么會拋出錯誤</p></div></django.db.models.fields.related_descriptors<>

[英]TypeError: Field 'id' expected a number but got <django.db.models.fields.related_descriptors

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

相關問題 從 django.db.models.fields.related.ForeignKey 獲取相關對象 <django.db.models.fields.related.RelatedManager object at 0x7ff4e003d1d0>不是JSON可序列化的 Django:無法保存模型 - 錯誤:“id”需要一個數字,但得到了<django.db.models.fields.related.ForeignKey...> django:如果模型具有相關模型(ForeignKey),則顯示主模型窗體中的字段 <ForeignKey>不是 JSON 可序列化的 Django 應用程序 為數據庫視圖相關的模型創建基本的Django模型類,並將所有ForeignKey字段設置為on_delete = DO_NOTHING TypeError:字段“id”需要一個數字但得到了<django.db.models.fields.related_descriptors< div><div id="text_translate"><p> 我有一個簡單的視圖,用於顯示根據請求數據的用戶類型有條件地過濾的所有當前用戶。</p><p> 模型.py</p><pre> class User(AbstractBaseUser, PermissionsMixin): class SEX(models.TextChoices): MALE = "MALE", "Male" FEMALE = "FEMALE", "Female" class TYPES(models.TextChoices): ... type = models.CharField( _("User Type"), max_length=50, choices=TYPES.choices, default=None, blank=True, null=True) sex = models.CharField( _("Sex Type"), max_length=50, choices=SEX.choices, default=None, blank=True, null=True) email = models.EmailField( _("Your Email"), max_length=254, unique=True, default=None, blank=True, null=True) student_id = models.CharField( _("student id"), unique=True, max_length=10, blank=True, null=True) firstname = models.CharField(max_length=250, blank=False, null=True) middlename = models.CharField(max_length=250, blank=True, null=True) lastname = models.CharField(max_length=250, blank=False, null=True) # grade = models.ForeignKey(Grade, verbose_name=_( # "grade"), on_delete=models.CASCADE, blank=True, null=True) room = models.ForeignKey(Class, verbose_name=_( "class"), on_delete=models.CASCADE, blank=True, null=True) phone = models.CharField( _("phone number"), max_length=13, blank=True, null=True) age = IntegerRangeField(min_value=1, max_value=99, default=25, blank=True, null=True) owns = models.ManyToManyField(School, verbose_name=_( "School_owner"), related_name='Schoolowner', blank=True) workes = models.ForeignKey(School, verbose_name=_( "School_workes"), related_name='Schoolworkes', on_delete=models.SET_NULL, blank=True, null=True) learns = models.ForeignKey(School, verbose_name=_( "School_learns"), related_name='Schoollearns', on_delete=models.SET_NULL, blank=True, null=True) image = models.ImageField( _("photo"), upload_to='user/pp', max_length=None, blank=False, null=True) joined_date = models.DateTimeField( _("created at"), auto_now=False, auto_now_add=True) is_active = models.BooleanField(default=False) is_staff = models.BooleanField(default=False) is_superuser = models.BooleanField(default=False) last_login = models.DateTimeField( _("last login"), auto_now=True, auto_now_add=False)</pre><p> <strong>序列化器.py</strong></p><pre> class MyAccountSerializer(serializers.ModelSerializer): image = serializers.ImageField() class Meta: model = User fields = ['id', 'sex', 'type', 'phone', 'image', 'email', 'student_id', 'firstname', 'middlename', 'lastname', 'image', 'joined_date', 'is_active', 'is_superuser', 'is_staff', 'last_login']</pre><p> <strong>視圖.py</strong></p><pre> class TeacherList(generics.ListAPIView): permission_classes = [IsAuthenticated, ] serializer_class = ListUsersSerializer queryset = User.objects.filter(type=User.TYPES.TEACHER)</pre><p> <em>像這樣的簡單過濾器沒有任何錯誤,但因為我需要根據請求用戶過濾響應</em></p><p>這就是我想用的</p><pre>class TeacherList(generics.ListAPIView): permission_classes = [IsAuthenticated, ] serializer_class = ListUsersSerializer # queryset = User.objects.filter(type=User.TYPES.TEACHER) def get_queryset(self): request = self.request.user if request.type == User.TYPES.OWNER: queryset = User.objects.filter( type=User.TYPES.TEACHER, workes=request.owns) elif request.type in [User.TYPES.STAFF, User.TYPES.DIRECTOR, User.TYPES.VICE_DIR]: queryset = User.objects.filter( type=User.TYPES.TEACHER, workes=request.workes) return queryset</pre><p> <strong>然而,這向我展示了一個如下所示的錯誤:</strong></p><pre> Field 'id' expected a number but got <django.db.models.fields.related_descriptors.create_forward_many_to_many_manager.<locals>.ManyRelatedManager object at 0x0000019D64AE7D60>.</pre><p> 我懷疑它與我有一個名為 owns 的多對多字段有關,這是我用來在其中一種情況下進行過濾的字段,但不知道為什么會拋出錯誤</p></div></django.db.models.fields.related_descriptors<> Django-用於與外鍵相關的多個模型的queryset 從django.db.models.fields.related導入RelatedManager Django:“ TypeError:[]不可JSON序列化”為什么?
 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM