使用了外键的models 结合 Modelviewset的写法
首先你要了解有外键的模式是怎么插入数据的
https://www.cnblogs.com/kaibindirver/p/16923586.html
写入相关
方法一
Serializers 重写create方法即可
class MemberSerializers(serializers.ModelSerializer):
def create(self, validate):
users = Member.objects.create(**validate)
return users
class Meta:
model=Member
exclude = ["create_time", "update_time"]
model
class Member(models.Model):
"""成员表"""
name = models.CharField(max_length=30,verbose_name='姓名')
nickname= models.CharField(max_length=30,verbose_name='Tapd的名字')
department_id = models.IntegerField(verbose_name='部门')
departmenttype = models.ForeignKey("DepartmentType",on_delete=models.CASCADE)
occupation_id = models.IntegerField(verbose_name='职能')
email = models.CharField(max_length=50,verbose_name='邮箱')
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
方法二
参考:
https://www.cnblogs.com/kaibindirver/p/16770753.html
validate_departmenttype 自定义校验先去查获得外键的对象再赋值。 (因为外键要传外键类对象,见上面的链接)
class MemberSerializers(serializers.ModelSerializer):
# #外键需要传对象
def validate_departmenttype(self, data):
id=DepartmentType.objects.filter(pk=data).first()
if id:
return id
else:
raise serializers.ValidationError(detail="部门类型不存在", code="1001")
class Meta:
model=Member
exclude = ["create_time", "update_time"]
查询相关
方法一
把外键字段赋于他对应外键模型的序列化类
from tapdmodular.serializer.departmenttypeSerializers import departmenttypeSerializers
class MemberSerializers(serializers.ModelSerializer):
# 反序列化获取外键字段
departmenttype = departmenttypeSerializers()

外键返回的字段去外键的序列化器里可以控制不展示的字段
class departmenttypeSerializers(serializers.ModelSerializer):
class Meta:
model=DepartmentType
exclude = ["create_time", "update_time"]
方法二
直接指定外键字段对应表的字段即可
class MemberSerializers(serializers.ModelSerializer):
# 反序列化获取外键字段
departmenttype = serializers.CharField(source="departmenttype.name")
方法三
class MemberSerializers(serializers.ModelSerializer):
# 反序列化获取外键字段
departmenttype=serializers.CharField()
在外键的model类__str__控制展示的字段
class DepartmentType(models.Model):
"""部门类型"""
name = models.CharField(max_length=30,unique = True,verbose_name='部门类型',error_messages=
{"max_length":"输入字符太多","unique":"类型已存在"})
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
class Meta:
db_table = 'tapd_departmenttype'
unique_together = ("name","name")
def __str__(self):
return self.name
方法四
https://www.cnblogs.com/kaibindirver/p/17227809.html
亲测可行 (增删改查)
增加的用了方法二
查的用了方法三
参考:https://www.5axxw.com/questions/content/am28gb
参考: https://blog.csdn.net/pinkman147834/article/details/90761354
结合变更返回字段实战
MemberSerializers
from rest_framework import serializers
from tapdmodular.models import Member, DepartmentType
class MemberSerializers(serializers.ModelSerializer):
departmenttype_id=serializers.CharField(source="departmenttype")
# #外键需要传对象
def validate_departmenttype_id(self, data):
id = DepartmentType.objects.filter(pk=data).first()
if id:
return id
else:
raise serializers.ValidationError(detail="部门类型不存在", code="1001")
class Meta:
model=Member
exclude = ["create_time", "update_time","departmenttype"]
modle
class Member(models.Model):
"""成员表"""
name = models.CharField(max_length=30,verbose_name='姓名')
nickname= models.CharField(max_length=30,verbose_name='Tapd的名字')
department_id = models.IntegerField(verbose_name='部门')
departmenttype = models.ForeignKey("DepartmentType",on_delete=models.CASCADE)
occupation_id = models.IntegerField(verbose_name='职能')
email = models.CharField(max_length=50,verbose_name='邮箱')
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
class Meta:
db_table = 'tapd_member' # 通过db_table自定义数据表名
unique_together=("name","department_id","occupation_id") #唯一约束
def __str__(self):
"""定义每个数据对象的显示信息"""
# nickname是tapd展示的名字
return self.nickname
class DepartmentType(models.Model):
"""部门类型"""
name = models.CharField(max_length=30,unique = True,verbose_name='部门类型',error_messages=
{"max_length":"输入字符太多","unique":"类型已存在"})
create_time = models.DateTimeField(auto_now_add=True,verbose_name='创建时间')
update_time = models.DateTimeField(auto_now=True,verbose_name='更新时间')
class Meta:
db_table = 'tapd_departmenttype'
unique_together = ("name","name")
def __str__(self):
return str(self.id)
请求参数
添加
{
"name": "xxxx15",
"nickname": "xx15",
"department_id": 7,
"occupation_id": 5,
"departmenttype_id":1,
"email": "asda.cn"
}
查询返回
{
"id": 90,
"departmenttype_id": "1",
"name": "xxx15",
"nickname": "xxx15",
"department_id": 7,
"occupation_id": 5,
"email": "guijingjing@codemao.cn"
}

浙公网安备 33010602011771号