Django models 如何在Django中的序列化程序中使用外键字段?

Django models 如何在Django中的序列化程序中使用外键字段?,django-models,django-rest-framework,django-serializer,Django Models,Django Rest Framework,Django Serializer,我有两种型号,用户和公司:- class User(AbstractUser): id = models.UUIDField( primary_key=True, default=uuid.uuid4, editable=False ) objects = UserManager() 及 现在,当只创建用户时,我想询问公司名称并只创建当时的公司 这是我的序列化程序: class CreateUserSerializer(serializers.Mode

我有两种型号,用户和公司:-

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

    objects = UserManager()

现在,当只创建用户时,我想询问公司名称并只创建当时的公司

这是我的序列化程序:

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']
但在服务器上,“公司”字段显示为下拉字段。
如何编写“我的公司”字段以同时创建用户和公司

您只需将@property添加到模型,并将序列化程序链接到该属性,而不是模型字段

PS避免模型和属性的名称重复

PPS您可以将源参数添加到序列化程序

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']

摘自

我试图为公司创建一个单独的serializer,并将其作为字段添加到用户序列化程序中,但我无法使read_only=True,因为当时我必须只添加公司名称,而不添加read_only。我得到queryset的错误。您确定在您的模型中吗?为什么公司将用户作为外键,而不是相反。它必须是smth。比如:class User(AbstractUser):id=models.UUIDField(primary_key=True,default=uuid.uuid4,editable=False)company=models.ForeignKey(User,ondelete=models.CASCADE)objects=UserManager(),而在公司模型中,除了在serializer中,用户没有任何内容。第二行:company=serializers.Charfield(source='company.name')用户应该是公司的所有者,因此我在公司模型中添加了一个fk。是否建议其他用户加入公司?在这种情况下,您将为每个用户创建一个公司实例
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']