Как использовать поле внешнего ключа в сериализаторе в Django? - PullRequest
0 голосов
/ 17 марта 2020

У меня есть две модели: Пользователь и Компания: -

class User(AbstractUser):
    id = models.UUIDField(
        primary_key=True, default=uuid.uuid4, editable=False
    )

    objects = UserManager()

и

class CompanyModel(basemodel.BaseModel):
    name = models.CharField(max_length=30, null=False, blank=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, default='', related_name='owner')
    ...

Теперь, создавая только пользователя, я хочу спросить название компании и создать компанию в только на этот раз

Вот мой сериализатор:

class CreateUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField()
    company = serializers.RelatedField(queryset=CompanyModel.objects.all())
    password = serializers.CharField(write_only=True, )

    def validate_email(self, email):
        if FederatedIdentityModel.objects.filter(email__iexact=email).exists():
            raise APIException(
                detail="Email id already exists!",
                code=status.HTTP_409_CONFLICT
            )
        return email.lower()

    def validate_company(self, company):
        if CompanyModel.objects.filter(name__iexact=company).exists():
            raise APIException(
                detail="Company already exists!",
                code=status.HTTP_409_CONFLICT
            )
        return company.lower()

    def create(self, validated_data):
        try:
            with transaction.atomic():
                user = User.objects.create(**validated_data)

                user_profile = UserProfileModel.objects.create(user=user)
                user_profile.__dict__.update(**validated_data)
                user_profile.save()

                company_profile = CompanyModel.objects.create(user=user, name=self.company)
                company_profile.__dict__.update(**validated_data)
                company_profile.save()

                return user
        except APIException:
            raise APIException(
                detail="Failed to register",
                code=status.HTTP_500_INTERNAL_SERVER_ERROR
            )

    class Meta:
        model = User
        fields = ['first_name', 'last_name', 'password', 'username', 'email', 'company']

Но на сервере поле компании отображается как раскрывающееся поле. Как я могу написать поле своей компании, чтобы создать пользователя и компанию одновременно

1 Ответ

0 голосов
/ 17 марта 2020

Вы можете просто добавить @property к модели и связать сериализатор не с полем модели, а с этим свойством.

PS избегайте дублирования имен для модели и свойств.

PPS Вы можете добавить источник param to serializer.

PPP, вы можете создать отдельный сериализатор для компании и связать его в другом сериализаторе, например:

class TrackSerializer(serializers.ModelSerializer):
    class Meta:
        model = Track
        fields = ['order', 'title', 'duration']

class AlbumSerializer(serializers.ModelSerializer):
     tracks = TrackSerializer(many=True, read_only=True)

    class Meta:
        model = Album
        fields = ['album_name', 'artist', 'tracks']

взято из https://www.django-rest-framework.org/api-guide/relations/

...