Как правильно сериализовать таблицу с несколькими внешними ключами в одну таблицу - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь создать API для теста. Однако данные таблицы не сериализуются должным образом. поле invalid_answers_ar отправляет восходящие числа вместо фактических данных. все остальные поля работают нормально

Сериализаторы работают частично. Я бегу Джанго 1.11

models.py

class Question(models.Model):
    question = models.CharField("Question",max_length=255,blank=True, null=True)
    question_ar = models.CharField("Question arabic",max_length=255,blank=True, null=True)
    correct_answer = models.CharField("Correct Answer",max_length=255,blank=True, null=True)
    correct_answer_ar = models.CharField("Correct Answer arabic",max_length=255,blank=True, null=True)
    def __str__(self):
        return (self.question)

class Incorrect(models.Model):
    incorrect_answers = models.CharField("Incorrect Answer",max_length=255,blank=True, null=True)
    incorrect_answers_ar = models.CharField("Incorrect Answer arabic",max_length=255,blank=True, null=True)
    question = models.ForeignKey(Question,related_name='incorrect_answers', on_delete=models.CASCADE,blank=True, null=True)
    question_ar = models.ForeignKey(Question,related_name='incorrect_answers_ar', on_delete=models.CASCADE,blank=True, null=True)
    def __str__(self):
        return (self.incorrect_answers)

admin.py

class IncorrectInline(admin.TabularInline):
    model = Incorrect
    fk_name = "question"

    class QuestionAdmin(admin.ModelAdmin):
    inlines = [
        IncorrectInline,
    ]

admin.site.register(Question, QuestionAdmin)

serializers.py

from .models import Question,Incorrect


class QuestionSerializer(serializers.ModelSerializer):
    incorrect_answers = serializers.StringRelatedField(many=True)
    class Meta:
        model = Question
        fields = ('question','question_ar', 'correct_answer','correct_answer_ar','incorrect_answers_ar','incorrect_answers')

views.py

class ListQuestionsView(generics.ListAPIView):
    queryset = Question.objects.all()
    serializer_class = QuestionSerializer

вот что я сейчас получаю

[
{
    "question": "how old are you",
    "question_ar": "old arabic",
    "correct_answer": "21",
    "correct_answer_ar": "21 ar",
    "incorrect_answers_ar": [
        1,
        2,
        3
    ],
    "incorrect_answers": [
        "22",
        "23",
        "24"
    ]
},
{
    "question": "my mobile?",
    "question_ar": "my mobile arabic?",
    "correct_answer": "asus",
    "correct_answer_ar": "asus arabic",
    "incorrect_answers_ar": [
        4,
        5,
        6
    ],
    "incorrect_answers": [
        "redmi",
        "samsung",
        "lg"
    ]
},
{
    "question": "My bike",
    "question_ar": "my bike arabic?",
    "correct_answer": "gixxer",
    "correct_answer_ar": "gixxer arabic",
    "incorrect_answers_ar": [
        7,
        8,
        9
    ],
    "incorrect_answers": [
        "hornet",
        "fz",
        "apache"
    ]
},
{
    "question": "What the hell?",
    "question_ar": "What the hell? arabic",
    "correct_answer": "shit",
    "correct_answer_ar": "shit arabic",
    "incorrect_answers_ar": [
        10,
        11,
        12,
        13
    ],
    "incorrect_answers": [
        "good",
        "bad",
        "okay",
        "great"
    ]
}
]

Как вы можете видеть, invalid_answers_ar выбрасывает числа вместо реальных значений. Есть идеи, что я делаю не так?

1 Ответ

2 голосов
/ 04 апреля 2019

Если вы не определите поле явно в сериализаторе, связанные поля будут сериализованы с их идентификаторами. Как вы сделали для invalid_answers , вам также нужно явно указать invalid_answers_ar в сериализаторе, чтобы использовать строковые значения. Как это:

class QuestionSerializer(serializers.ModelSerializer):
    incorrect_answers = serializers.StringRelatedField(many=True)
    incorrect_answers_ar = serializers.StringRelatedField(many=True)
    class Meta:
        model = Question
        fields = ('question','question_ar', 'correct_answer','correct_answer_ar','incorrect_answers_ar','incorrect_answers')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...