使用了外键的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"
}

 

posted @ 2022-11-26 15:46  凯宾斯基  阅读(171)  评论(0)    收藏  举报