Поле сериализации внешнего ключа - PullRequest
0 голосов
/ 24 мая 2019

У меня есть следующие модели:

class Question(models.Model):
    test = models.ForeignKey(Test, on_delete=models.CASCADE)
    text = models.CharField(max_length=255,default='',blank=False)
    number = models.IntegerField()

    def __str__(self):
        return self.text

class Test(models.Model):
    PRIVACY_TYPES = (
        ('PR', 'Private'),
        ('PU', 'Public'),
    )
    user = models.ForeignKey(User, on_delete=models.PROTECT)
    name = models.CharField(max_length=255,default='',blank=False)
    datecreated = models.DateTimeField(auto_now=True)
    privacy = models.CharField(choices=PRIVACY_TYPES, default='PR',max_length=15)
    testtime = models.IntegerField(default=30)


class User(AbstractBaseUser, models.Model):
    username = models.CharField(max_length=20,default='',blank=True)
    password = models.CharField(max_length=80,default='',blank=True)
    email = models.CharField(max_length=255,default='',blank=True)

Я пытаюсь сериализовать тестовый объект, чтобы также включить имя пользователя и идентификатор из модели User.Вот сериализатор, который я пытаюсь:

class TestSerializer(serializers.ModelSerializer):
    question_set = QuestionSerializer(many=True)
    user = UserSerializer(source='user')

    class Meta:
        model = Test
        fields = ('id', 'name', 'privacy', 'testtime', 'user', 'question_set')
        related_object = 'question'

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

class UserSerializer(serializers.Serializer):
    class Meta:
        model = User
        fields = ('id', 'username')

Набор вопросов отлично сериализуется таким образом, но с отношениями наоборот, еслиэто правильный способ описать это, для пользователя я получаю пустой объект с этим кодом.Я пробовал user_username и user.username в полях, но это не работает.

Я искал в Интернете и просматривал документы Django-Rest-Framework, но могу найти только примеры, где связьвопрос для проверки.

1 Ответ

2 голосов
/ 25 мая 2019

Надеюсь, я правильно понимаю ваш вопрос.

Your models.py

class Question(models.Model):
        test = models.ForeignKey(Test, on_delete=models.CASCADE)
        text = models.CharField(max_length=255,default='',blank=False)
        number = models.IntegerField()

        def __str__(self):
            return self.text



class Test(models.Model):
        PRIVACY_TYPES = (
            ('PR', 'Private'),
            ('PU', 'Public'),
        )
        user = models.ForeignKey(User, on_delete=models.PROTECT)
        name = models.CharField(max_length=255,default='',blank=False)
        datecreated = models.DateTimeField(auto_now=True)
        privacy = models.CharField(choices=PRIVACY_TYPES, default='PR',max_length=15)
        testtime = models.IntegerField(default=30)

Мой вопрос обновлен, чтобы показать вам, что означает ForeignKey.ForeignKey означает ManyToOne.У вас есть ForeignKey поле в вопросе Model со ссылкой на Test Модель.Идея в том, что у вас есть Множество Question и Один Test (ManyToOne) и наоборот Один Test и Множество Question.

Это решение ниже.

class TestSerializer(serializers.ModelSerializer):
    question_set = QuestionSerializer(many=True)
    user = serializers.ReadOnlyField(source='user.username')

    class Meta:
        model = Test
        fields = ('id', 'name', 'privacy', 'testtime', 'user', 'question_set')
        related_object = 'question'

А теперь воспользуйся ,,,

test_obj = Test.objects.get(pk=1)
test_serializer = TestSerializer(instance=test_obj)
print(test_serializer.data)
...