【发布时间】:2022-02-03 15:26:55
【问题描述】:
我有这样的模型:
class Company(models.Model):
"""Company model"""
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
active = models.BooleanField(default=False, blank=True, null=True)
type = models.JSONField(max_length=200, blank=True, null=True)
name = models.CharField(max_length=200, blank=True, null=True)
alias = models.CharField(max_length=200, blank=True, null=True)
telecom = models.JSONField(max_length=200, blank=True, null=True)
address = models.CharField(max_length=200, blank=True, null=True)
part_of = models.ForeignKey("company.Company", on_delete=models.SET_NULL, null=True,
blank=True, related_name="parent")
created_at = models.DateTimeField(auto_now_add=True, blank=False, null=True)
updated_at = models.DateTimeField(auto_now_add=True, blank=False, null=True)
deleted_at = models.DateTimeField(default=None, blank=True, null=True)
class Meta:
db_table = 'organizations'
def __str__(self):
return self.name
和序列化器:
class CompanySerializer(serializers.ModelSerializer):
class Meta:
model = Company
fields = '__all__'
read_only_fields = ("id",)
part_of = serializers.PrimaryKeyRelatedField(queryset=Company.objects.all())
def create(self, validated_data):
part_of = validated_data.pop("part_of")
if part_of:
company_id = Company.objects.create(**part_of)
validated_data['part_of'] = company_id
company = Company.objects.create(**validated_data)
return company
并查看:
class CompanyViewSet(viewsets.GenericViewSet, mixins.ListModelMixin, mixins.CreateModelMixin):
serializer_class = serializers.CompanySerializer
queryset = Company.objects.all()
def get_queryset(self):
return self.queryset.all()
def perform_create(self, serializer):
serializer.save()
"part_of":"" 的空值可以正常工作,但是当我为 part_of 传递值时它不起作用。 part_of 基本上是我正在尝试创建的母公司。所以我的期望是首先创建一个公司(part_of),获取它的 id 并将该 id 作为另一家公司的外键。 任何人都实现了类似的?或者我在这里做错了什么,建议,帮助表示赞赏。提前致谢。
我得到的错误是:
{
"part_of": [
"“{ 'name': 'Parent of Organization', 'telecom': [{'system': 'phone', 'value': '677-7777'}, {'system': 'email', 'value': 'customerservice@abc.com'}], 'address': [{'line': ['3300 Washtenaw Avenue, Suite 227'], 'city': 'Amherst', 'state': 'MA', 'postalCode': '01002', 'country': 'USA'}]}” is not a valid UUID."
]
}
【问题讨论】:
-
由于
part_of字段已被声明为PrimaryKeyRelatedField,它需要一个主键而不是公司对象。在这种情况下,您还需要将CompanySerializer用于part_of -
@BrianDestura,我可以像这样在其中调用相同的序列化程序吗?
class CompanySerializer(serializers.ModelSerializer): class Meta: model = Company fields = '__all__' read_only_fields = ("id",) part_of = CompanySerializer(many=false, readonly=false)