Django 2.1 create 方法来创建嵌套字段(外键关系)。使用 Django 的 Rest 框架
Django 2.1 create method to create nested fields (foreignkey relation). Using Django's Rest Framework
我应该在 jango 2.1 中使用哪种方法来创建方法来添加新对象,该对象还支持创建嵌套字段(ForeignKey 关系)。我总是收到错误消息:
AssertionError at /client/create/
The .create()
method does not support writable nested fields by default.
用户模型
class User(models.Model):
gender = models.CharField(max_length=10, choices=GENDER)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
position = models.CharField(max_length=50)
birthday = models.DateField(auto_created=False)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=15)
password = models.CharField(max_length=100)
def __str__(self):
return f"{self.first_name} {self.last_name} {self.position} {self.email} {self.phone} {self.password}"
公司型号
class Company(models.Model):
company_name = models.CharField(max_length=50, blank=False)
address = models.CharField(max_length=50, blank=False)
zip = models.IntegerField(blank=False)
city = models.CharField(max_length=50, blank=False)
email = models.EmailField(max_length=50, blank=False)
def __str__(self):
return f"{self.company_name} {self.address} {self.zip} {self.city}"
客户公司
class ClientCompany(models.Model):
client = models.ForeignKey(Company, on_delete=models.PROTECT)
contact_person = models.ForeignKey(User, on_delete=models.PROTECT)
status = models.CharField(max_length=15, choices=STATUS, default='Aktiv')
def __str__(self):
return f"{self.client} {self.contact_person} {self.status}"
用户序列化程序
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
ClientCompanySerializer
class ClientCompanySerializer(serializers.ModelSerializer):
client = CompanySerializer(many=False, read_only=False)
contact_person = ClientUserSerializer(many=False, read_only=True)
class Meta:
model = ClientCompany
fields = '__all__'
UserUrls
urlpatterns = [
path('update/id<int:id>', UpdateUserByID.as_view(), name='user-update'),
path('id/<int:id>', GetUserByID.as_view(), name='user-id'),
path('create', CreateUser.as_view(), name='create-user'),
path('delete/id/<int:id>', DeleteUserByID.as_view(), name='delete-user'),
]
公司网址
urlpatterns = [
path('update/id<int:id>', CompanyUpdateByID.as_view(), name='company-udpate'),
path('id/<int:id>', CompanyById.as_view(), name='company-id'),
path('create/', CreateCompany.as_view(), name='company-create'),
path('delete/id/<int:id>', DeleteCompanyByID.as_view(), name='company-delete')
]
公司视图
class CreateCompany(generics.CreateAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer
我的目标是在 url /company/create/
中创建一家新公司(以及相关的 fk 'contact_person')
有没有办法在 'ClientCompanySerializer' 中创建相关的 'contact_person' 或者我应该使用不同的方法。
您需要覆盖序列化程序中的默认 create
和 update
方法,如下所示:
首先从 contact_person
中删除 read_only=True
def create(self, validated_data):
client = validated_data.pop('client')
contact_person = validated_data.pop('contact_person')
client_instance = Company.object.create(**client)
contact_person_instance = User.object.create(**contact_person)
return ClientCompany.objects.create(client=client_instance,contact_person=contact_person_instance , **validated_data)
另外,为 update
实施类似的方法
我应该在 jango 2.1 中使用哪种方法来创建方法来添加新对象,该对象还支持创建嵌套字段(ForeignKey 关系)。我总是收到错误消息:
AssertionError at /client/create/ The
.create()
method does not support writable nested fields by default.
用户模型
class User(models.Model):
gender = models.CharField(max_length=10, choices=GENDER)
first_name = models.CharField(max_length=20)
last_name = models.CharField(max_length=20)
position = models.CharField(max_length=50)
birthday = models.DateField(auto_created=False)
email = models.EmailField(max_length=50)
phone = models.CharField(max_length=15)
password = models.CharField(max_length=100)
def __str__(self):
return f"{self.first_name} {self.last_name} {self.position} {self.email} {self.phone} {self.password}"
公司型号
class Company(models.Model):
company_name = models.CharField(max_length=50, blank=False)
address = models.CharField(max_length=50, blank=False)
zip = models.IntegerField(blank=False)
city = models.CharField(max_length=50, blank=False)
email = models.EmailField(max_length=50, blank=False)
def __str__(self):
return f"{self.company_name} {self.address} {self.zip} {self.city}"
客户公司
class ClientCompany(models.Model):
client = models.ForeignKey(Company, on_delete=models.PROTECT)
contact_person = models.ForeignKey(User, on_delete=models.PROTECT)
status = models.CharField(max_length=15, choices=STATUS, default='Aktiv')
def __str__(self):
return f"{self.client} {self.contact_person} {self.status}"
用户序列化程序
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
ClientCompanySerializer
class ClientCompanySerializer(serializers.ModelSerializer):
client = CompanySerializer(many=False, read_only=False)
contact_person = ClientUserSerializer(many=False, read_only=True)
class Meta:
model = ClientCompany
fields = '__all__'
UserUrls
urlpatterns = [
path('update/id<int:id>', UpdateUserByID.as_view(), name='user-update'),
path('id/<int:id>', GetUserByID.as_view(), name='user-id'),
path('create', CreateUser.as_view(), name='create-user'),
path('delete/id/<int:id>', DeleteUserByID.as_view(), name='delete-user'),
]
公司网址
urlpatterns = [
path('update/id<int:id>', CompanyUpdateByID.as_view(), name='company-udpate'),
path('id/<int:id>', CompanyById.as_view(), name='company-id'),
path('create/', CreateCompany.as_view(), name='company-create'),
path('delete/id/<int:id>', DeleteCompanyByID.as_view(), name='company-delete')
]
公司视图
class CreateCompany(generics.CreateAPIView):
queryset = Company.objects.all()
serializer_class = CompanySerializer
我的目标是在 url /company/create/
中创建一家新公司(以及相关的 fk 'contact_person')有没有办法在 'ClientCompanySerializer' 中创建相关的 'contact_person' 或者我应该使用不同的方法。
您需要覆盖序列化程序中的默认 create
和 update
方法,如下所示:
首先从 contact_person
read_only=True
def create(self, validated_data):
client = validated_data.pop('client')
contact_person = validated_data.pop('contact_person')
client_instance = Company.object.create(**client)
contact_person_instance = User.object.create(**contact_person)
return ClientCompany.objects.create(client=client_instance,contact_person=contact_person_instance , **validated_data)
另外,为 update