Общие отношения Django - объект типа ** не является сериализуемым в формате JSON - PullRequest
0 голосов
/ 04 мая 2019

Все еще новичок в Джанго, так что терпите меня.

Я пытаюсь следовать примеру Джанго https://docs.djangoproject.com/en/2.2/ref/contrib/contenttypes/.

Я пытаюсь использовать tests.py для создания заметок для ученика 1.

Вот тесты.py:

from django.test import TestCase
from gsndb.models import *
from django.contrib.contenttypes.models import ContentType
from django.contrib.auth.models import User

# Create your tests here.

student = Student.objects.get(id=4)
text = "The student is content"
user = User.objects.get(id=2)

new_note = Note(text=text, content_object = student, user = user)

new_note.save()

Я хочу создать заметку для ученика 1. Однако, когда я запускаю тест, я получаю эту ошибку:

Object of type 'Student' is not JSON serializable

Вот трассировка:

Environment:


Request Method: GET
Request URL: http://localhost/gsndb/note/

Django Version: 2.1.7
Python Version: 3.6.8
Installed Applications:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'corsheaders',
 'rest_framework',
 'user_app.apps.UserAppConfig',
 'gsndb.apps.GsndbConfig']
Installed Middleware:
['corsheaders.middleware.CorsMiddleware',
 'django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']



Traceback:

File "/usr/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  156.                 response = self.process_exception_by_middleware(e, request)

File "/usr/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  154.                 response = response.render()

File "/usr/lib/python3.6/site-packages/django/template/response.py" in render
  106.             self.content = self.rendered_content

File "/usr/lib/python3.6/site-packages/rest_framework/response.py" in rendered_content
  72.         ret = renderer.render(self.data, accepted_media_type, context)

File "/usr/lib/python3.6/site-packages/djangorestframework_camel_case2/render.py" in render
  9.                                                          **kwargs)

File "/usr/lib/python3.6/site-packages/rest_framework/renderers.py" in render
  107.             allow_nan=not self.strict, separators=separators

File "/usr/lib/python3.6/site-packages/rest_framework/utils/json.py" in dumps
  28.     return json.dumps(*args, **kwargs)

File "/usr/lib/python3.6/json/__init__.py" in dumps
  238.         **kw).encode(obj)

File "/usr/lib/python3.6/json/encoder.py" in encode
  199.         chunks = self.iterencode(o, _one_shot=True)

File "/usr/lib/python3.6/json/encoder.py" in iterencode
  257.         return _iterencode(o, 0)

File "/usr/lib/python3.6/site-packages/rest_framework/utils/encoders.py" in default
  68.         return super(JSONEncoder, self).default(obj)

File "/usr/lib/python3.6/json/encoder.py" in default
  180.                         o.__class__.__name__)

Exception Type: TypeError at /gsndb/note/
Exception Value: Object of type 'Student' is not JSON serializable

Вот модели.py

class Note(models.Model):
    user = models.ForeignKey(
        get_user_model(),
        on_delete = models.PROTECT,
    )
    created = models.DateTimeField(default = timezone.now)
    text = models.TextField()

    # Below the mandatory fields for generic relation
    content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type','object_id')

class Student(models.Model):
    current_school = models.ForeignKey(
        "School",
        null = True,
        on_delete = models.PROTECT,
    )
    current_program = models.ForeignKey(
        "Program",
        null = True,
        on_delete = models.PROTECT,
    )
    first_name = models.CharField(max_length = 35, blank=True)
    last_name = models.CharField(max_length = 35, blank=True)
    middle_name = models.CharField(max_length = 35, blank=True)
    """Establish choices for Gender"""
    GENDER_CHOICES = (
        ("M", 'Male'),
        ("F", 'Female'),
        ("NB", 'NonBinary'),
    )
    gender = models.CharField(
            max_length = 2,
            blank = True,
            choices = GENDER_CHOICES,
    )
    birth_date = models.DateField(null = True)
    state_id = models.BigIntegerField(null = True)
    """Establish choices for Grade Year"""
    GRADE_YEAR_CHOICES = (
        (0, 'Kindergarten'),
        (1, 'First Grade'),
        (2, 'Second Grade'),
        (3, 'Third Grade'),
        (4, 'Fourth Grade'),
        (5, 'Fifth Grade'),
        (6, 'Sixth Grade'),
        (7, 'Seventh Grade'),
        (8, 'Eighth Grade'),
        (9, 'Ninth Grade'),
        (10, 'Tenth Grade'),
        (11, 'Eleventh Grade'),
        (12, 'Twelfth Grade'),
    )
    grade_year = models.SmallIntegerField(
        choices = GRADE_YEAR_CHOICES,
        null = True,
    )
    reason_in_program = models.TextField(blank=True)
    notes = GenericRelation(Note)

Вот serializers.py:

class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ("user",
            "created",
            "text",
            "content_type",
            "object_id",
            "content_object")

class StudentSerializer(serializers.BaseSerializer):

        def to_representation(self, student_obj):
            notes = NoteSerializer(many = True)
            notes_json = notes.data

            return {
                "current_school": student_obj.current_school.id,
                "current_program": student_obj.current_program.id,
                "first_name": student_obj.first_name,
                "last_name": student_obj.last_name,
                "middle_name": student_obj.middle_name,
                "gender": student_obj.gender,
                "birth_date": student_obj.birth_date,
                "state_id": student_obj.state_id,
                "grade_year": student_obj.grade_year,
                "reason_in_program": student_obj.reason_in_program,
                "notes": notes_json,
            }

Вот мои взгляды.py:

class NoteList(generics.ListCreateAPIView):
    queryset = Note.objects.all()
    serializer_class = NoteSerializer

Спасибо за ваше время!

1 Ответ

1 голос
/ 05 мая 2019

Разобрался с моей проблемой. Это было в моих взглядах.

Мой взгляд был

class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ("user",
            "created",
            "text",
            "content_type",
            "object_id",
            "content_object")

Мне нужно было удалить «content_object», потому что он не был сериализуемым в формате JSON. Это должно было выглядеть так:

class NoteSerializer(serializers.ModelSerializer):
    class Meta:
        model = Note
        fields = ("user",
            "created",
            "text",
            "content_type",
            "object_id")

Спасибо за помощь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...