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
вы используете модель, отличную от той, которая определена в сериализаторе, вы получите эту ошибку.