【问题标题】:How to use foreign key field in a serializer in Django?如何在 Django 的序列化程序中使用外键字段?
【发布时间】:2020-03-17 08:35:25
【问题描述】:

我有两个模型用户和公司:-

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

但在服务器上,公司字段显示为下拉字段。 如何编写公司字段以同时创建用户和公司

【问题讨论】:

    标签: django-models django-rest-framework django-serializer


    【解决方案1】:

    您可以简单地将@property 添加到模型并将序列化程序链接到模型字段而不是模型字段。

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

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

    您可以为公司制作一个单独的序列化程序并将其链接到另一个序列化程序中,例如:

    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/

    【讨论】:

    • 我试图为公司创建一个单独的序列化程序并将其作为一个字段添加到用户序列化程序但我不能使 read_only=True 因为我必须在那时添加公司名称没有 read_only 我得到查询集的错误。
    • 你确定你的模型?为什么公司有一个用户作为外键,反之亦然。它必须是smth。像: class User(AbstractUser): id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) company = models.ForeignKey(User, ondelete=models.CASCADE) objects = UserManager() 而没有公司模型中的用户比序列化程序中的用户只需第二行:company = serializers.Charfield(source='company.name')
    • 用户应该是公司的所有者,所以我在公司模型中添加了一个fk
    • 其他用户是否建议加入公司?
    • 在这种情况下,您将为每个用户创建一个公司实例
    猜你喜欢
    • 2021-02-13
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    相关资源
    最近更新 更多