欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SlugRelatedField自动创建关联表对象

程序员文章站 2022-04-10 13:56:28
SlugRelatedField自动创建关联表对象例如有以下模型类,此处外键设置时blank和null约束条件必须设为Trueclass Book(models.Model): book_id = models.CharField(max_length=150) name = models.CharField(max_length=50) class Meta: db_table = 'book'class Characters(mod...

SlugRelatedField自动创建关联表对象

例如有以下模型类,此处外键设置时blank和null约束条件必须设为True


class Book(models.Model):

    book_id = models.CharField(max_length=150)
    name = models.CharField(max_length=50)

    class Meta:
        
        db_table = 'book'

class Characters(models.Model):
    name = models.CharField(max_length=50)
    books =models.ForeignKey('Book',related_name='Characters',on_delete=models.CASCADE,blank=True,null=True)

    class Meta:
        
        db_table = 'characters'

​ DRF中利用SlugRelatedField字段进行反序列化时,假如想同时反序列化数据到关联表,可以重写 SlugRelatedFiedld类里的to_internal_value方法。前提:slug_field指定字段是唯一必传字段,先看看 to_internal_value代码。

class SlugRelatedField(RelatedField):
   """
   A read-write field that represents the target of the relationship
   by a unique 'slug' attribute.
   
  	以唯一字段表示表之间关系
   
   """
.......

def to_internal_value(self, data):
       try:
           return self.get_queryset().get(**{self.slug_field: data}) # 获取返回slug_field指定字段所传入的数据。
       except ObjectDoesNotExist:
           self.fail('does_not_exist', slug_name=self.slug_field, value=smart_str(data))
       except (TypeError, ValueError):
           self.fail('invalid')
.......

此处把self.get_queryset().get({self.slug_field: data})重写为get_or_create({self.slug_field: data})[0]即可。

# 重写to_internal_value方法
class SlugRelatedField(serializers.SlugRelatedField):

def to_internal_value(self, data):
        try:
            return self.get_queryset().get_or_create(**{self.slug_field: data})[0]
      
        except (TypeError, ValueError):
            self.fail('invalid')

# 定义书本序列化器
class BookSerializers(serializers.ModelSerializer):

    Characters=SlugRelatedField(many=True,queryset=Characters.objects.all(),slug_field='name')

    class Meta:
        model = Book
        fields = ['book_id','name','Characters']

传入数据校验并保存到数据库

data = {
    "book_id":1,
    "name":"神雕侠侣",
    "Characters":["杨过","小龙女","郭靖"]


}

bs = BookSerializers(data=data)
bs.is_valid()
bs.save()

结果如下图
SlugRelatedField自动创建关联表对象
SlugRelatedField自动创建关联表对象

本文地址:https://blog.csdn.net/jojotaro1/article/details/107533375