Как передать назначение объекта в отношение внешнего ключа в REST Framework? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть две модели:

class Group(models.Model):
    name = models.CharField(max_length=50, null=False, blank=False)

class User(models.Model):
    username = models.CharField(max_length=50, null=False, blank=False)
    password = models.CharField(max_length=50, null=False, blank=False)
    group = models.ForeignKey(Group, null=False, on_delete=models.CASCADE)

И у меня есть сериализаторы для них обоих:

class GroupSerializer(serializers.Serializer):
    name = serializers.CharField()

class UserSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()
    group = serializers.PrimaryKeyRelatedField(queryset=Group.objects.all())

Затем в представлении регистрации я пытаюсь автоматически создать группу когда пользователь регистрирует свою учетную запись:

@api_view(['POST'])
def registration(request):
    # Creates a new group
    g_serializer = GroupSerializer(data=request.data, partial=True)
    g_serializer.is_valid(raise_exception=True)
    group = g_serializer.save()
    # Creates a new user
    u_serializer = UserSerializer(data=request.data, partial=True)
    u_serializer.is_valid(raise_exception=True)
    user = u_serializer.save()

Как вы можете себе представить, ошибка, которую я получаю, заключается в том, что поле group для класса User нарушает ненулевое ограничение. Я попытался исправить это, выполнив u_serializer['group'] = group.id или u_serializer['group'] = group, но он выдает следующую ошибку:

TypeError: 'UserSerializer' object does not support item assignment

Как я могу справиться с этим? Новый объект Group правильно создается и вставляется в базу данных, и мне нужно назначить этот объект для user.group.

1 Ответ

0 голосов
/ 10 февраля 2020

Согласно этому { ссылка } в вашем случае будет:

...
# Creates a new user
u_serializer = UserSerializer(data=data, partial=True)
u_serializer.is_valid(raise_exception=True)
user = u_serializer.save(group=group)
...
...