Got AttributeError при попытке получить значение для поля 'status_code'

Я получаю сообщение об ошибке

AttributeError: Got AttributeError when attempting to get a value for field `status_code` on serializer `MedTestGetTestResultSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `unicode` instance.
Original exception text was: 'unicode' object has no attribute 'status_code'.

когда я пытаюсь написать сериализатор Django.

Мой сериализатор выглядит следующим образом:

class MedTestGetTestSerializer(serializers.ModelSerializer):
    test_id = serializers.CharField(source='medteststypetest_id.test_id')
    test_name = serializers.CharField(source='medteststypetest_id.test_name')
    username = serializers.CharField(source='user_id.username')
    user_id = serializers.CharField(source='user_id.user_id')
    kit_id = serializers.CharField(source='kit_id.kit_id')
    test_results = MedTestGetTestResultSerializer(source='medtests_id', many=True, required=False)

class Meta:
    model = MedTests
    fields = ("medtests_id",
              "datekitord",
              "testdate",
              "user_id",
              "kit_id",
              "status",
              "username",
              "test_name",
              "test_id",
              "test_results")

Мой вложенный сериализатор выглядит следующим образом:

class MedTestGetTestResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = MedTestsResults
        fields = ("result_date",
                  "value",
                  "test_started",
                  "status_code")

Почему я должен получать эту ошибку? Когда я пытаюсь использовать второй сериализатор в оболочке, я получаю ошибку status_code, когда не устанавливаю много = True, но я устанавливаю много = True в первом сериализаторе.

Модель MedTestsResults:

class MedTestsResults(models.Model):
    medtests_results_id = models.CharField(max_length=100)
    medtests_id = models.ForeignKey(MedTests)
    result_date = models.DateTimeField(null=True, blank=True)
    test_started = models.DateTimeField(null=True, blank=True)
    status_code = models.CharField(max_length=25)
    value = models.IntegerField(null=True, blank=True)
    hiv4g_rsltdate = models.DateTimeField(null=True, blank=True)
    hivms_rsltdate = models.DateTimeField(null=True, blank=True)
    hiv4gpos = models.CharField(max_length=100, null=True, blank=True)
    hiv4gneg = models.CharField(max_length=100, null=True, blank=True)
    hiv4gind = models.CharField(max_length=100, null=True, blank=True)
    hiv4grej = models.CharField(max_length=100, null=True, blank=True)
    hivmpos = models.CharField(max_length=100, null=True, blank=True)
    hivmsneg = models.CharField(max_length=100, null=True, blank=True)
    hivmsind = models.CharField(max_length=100, null=True, blank=True)
    hivmsrej = models.CharField(max_length=100, null=True, blank=True)

MedTests:

class MedTests(models.Model):
    medtests_id = models.CharField(max_length=100)
    medteststypetest_id = models.ForeignKey(MedTestsType)
    datekitord = models.DateTimeField()
    testdate = models.DateTimeField()
    status = models.CharField(max_length=100)
    hiv4g_testdate = models.DateTimeField(blank=True, null=True)
    hivms_testdate = models.DateTimeField(blank=True, null=True)
    kit_id = models.ForeignKey(Kits)
    user_id = models.ForeignKey(User)

Ответ 1

ответ: используйте att_name attr

models.py

class MedTest(models.Model):
    date_kit_ord = models.DateTimeField()
    test_date = models.DateTimeField()
    status = models.CharField(max_length=100)
    hiv4g_test_date = models.DateTimeField(blank=True, null=True)
    hivms_test_date = models.DateTimeField(blank=True, null=True)
    user = models.ForeignKey(User)

class MedTestResult(models.Model):
    med_test_result = models.CharField(max_length=100)
    med_test = models.ForeignKey(MedTest, related_name='med_tests')
    result_date = models.DateTimeField(null=True, blank=True)
    test_started = models.DateTimeField(null=True, blank=True)
    status_code = models.CharField(max_length=25)
    value = models.IntegerField(null=True, blank=True)
    hiv4g_rsltdate = models.DateTimeField(null=True, blank=True)
    hivms_rsltdate = models.DateTimeField(null=True, blank=True)
    hiv4gpos = models.CharField(max_length=100, null=True, blank=True)
    hiv4gneg = models.CharField(max_length=100, null=True, blank=True)
    hiv4gind = models.CharField(max_length=100, null=True, blank=True)
    hiv4grej = models.CharField(max_length=100, null=True, blank=True)
    hivmpos = models.CharField(max_length=100, null=True, blank=True)
    hivmsneg = models.CharField(max_length=100, null=True, blank=True)
    hivmsind = models.CharField(max_length=100, null=True, blank=True)
    hivmsrej = models.CharField(max_length=100, null=True, blank=True)

tracing.py

import os
import django

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'youproject.settings')

django.setup()

from rest_framework import serializers

from frontend import models as fm

class MedTestResultSerializer(serializers.ModelSerializer):
    class Meta:
        model = fm.MedTestResult
        fields = ('result_date',
                  'value',
                  'test_started',
                  'status_code')

class MedTestSerializer(serializers.ModelSerializer):
    username = serializers.CharField(source='user.username')
    user_id = serializers.CharField(source='user.id')
    med_tests = MedTestResultSerializer(many=True)

    class Meta:
        model = fm.MedTest
        fields = (
            'med_tests',
            'user_id',
            'username',
        )


print MedTestSerializer(fm.MedTest.objects.all()[0]).data

И очень трудно читать ваш код (стиль, соглашения об именах и т.д.), Попробуйте два шага

Ответ 2

Я думаю, что django-rest-framework использует status_code где-нибудь, вы можете попробовать переименовать свое поле status_code в другое.

Ответ 3

Проблемы могут быть в поле зрения, как в моем случае. Если вы определили неправильный queryset по вашему мнению, вы получите эту ошибку. например

class YourViewSet(ModelViewSet):
    queryset = WrongModel.objects.all()
    serializer_class = YourSerializer

Если для значения вашего queryset вы используете модель, отличную от той, которая определена в сериализаторе, вы получите эту ошибку.