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