Skip to main content
 首页 » 编程设计

python之如何在 Django 中使用多个嵌套字段覆盖序列化程序中的创建方法

2024年10月01日45飞鱼

我正在尝试创建一个可写的嵌套序列化程序。 我阅读了 django rest 文档,但在我的情况下,我有多个嵌套字段并且不知道如何解决我收到此错误:

类型错误在/api/v1/libraries/ “tel_number”是此函数的无效关键字参数

模型.py:

class RegisterRule(models.Model): 
    picture        = models.BooleanField(default=False) 
    passport       = models.BooleanField(default=False) 
    education_rule = models.CharField(max_length=255) 
 
 
class SpecificInformatin(models.Model): 
    specific_name = models.CharField(max_length=255) 
    description   = models.TextField(max_length=255) 
 
    def __unicode__(self): 
        return self.specific_name 
 
 
class District(models.Model): 
 
    district = models.CharField(max_length=2) 
 
    def __unicode__(self): 
        return self.district 
 
 
class Address(models.Model): 
 
    district      = models.ForeignKey(District, on_delete=models.CASCADE) 
    square        = models.CharField(max_length=20) 
    master_street = models.CharField(max_length=20) 
    slave_street  = models.CharField(max_length=20) 
    plaque        = models.CharField(max_length=3) 
 
    def __unicode__(self): 
        return self.slave_street 
 
 
class Library(models.Model): 
 
    name                      = models.CharField(max_length=30) 
    address                   = models.OneToOneField(Address, on_delete=models.CASCADE, related_name='address') 
    reading_room              = models.BooleanField(default=False) 
    reading_room_start_time   = models.CharField(max_length=10, default='8:00') 
    reading_room_end_time     = models.CharField(max_length=10, default='20:00') 
    library_start_time        = models.CharField(max_length=10, default='8:00') 
    library_end_time          = models.CharField(max_length=10, default='20:00') 
    specific_information      = models.ManyToManyField(SpecificInformatin) 
    register_rules            = models.ManyToManyField(RegisterRule) 
    gender_days_in_week       = models.CharField(max_length=100, default='mens') 
    manager_of_library        = models.CharField(max_length=50, default='shahrdari') 
    tel_number                = models.CharField(max_length=11, null=True) 
    email                     = models.EmailField(max_length=40, default="@.com") 
    from_user                 = models.BooleanField(default=False) 
 
    def __unicode__(self): 
        return self.name 

序列化程序.py:

class LibrarySerializer(serializers.ModelSerializer): 
 
    address = AddressSerializer() 
    specific_information = SpecificSerializer(many=True) 
    register_rules = RegisterRulesSerialzers(many=True) 
 
    class Meta: 
        model = Library 
        fields = ('id', 'name', 'address', 'reading_room', 'reading_room_start_time' 
                  , 'reading_room_end_time', 'library_start_time', 'library_end_time' 
                  , 'specific_information', 'register_rules', 'gender_days_in_week' 
                  , 'manager_of_library', 'tel_number', 'email', 'from_user') 
 
    def create(self, validated_data): 
        address_data = validated_data.pop('address') 
        address = Address.objects.create(**validated_data) 
 
        register_rules_data = validated_data.pop('register_rules') 
        register_rules = RegisterRule.objects.create(**validated_data) 
 
        specific_information_data = validated_data.pop('specific_information') 
        specific_information = SpecificInformatin.objects.create(**validated_data) 
 
        library = Library.objects.create(**validated_data) 
 
        library.address(address=address, **address_data) 
 
        for data in register_rules_data: 
            library.register_rules.add(register_rules=register_rules, **data) 
        for data in specific_information_data: 
            library.specific_information.add(specific_information=specific_information, **data) 
 
        return library 

请您参考如下方法:

你做错了。当您从字典中弹出一些数据时,它会返回特定数据的值。

create(self, validated_data): 
        address_data = validated_data.pop('address') 
        address = Address.objects.create(**address_data) 
 
        register_rules_data = validated_data.pop('register_rules') 
 
        specific_information_data = validated_data.pop('specific_information') 
 
        library = Library.objects.create(address=address, **validated_data) 
 
        for data in register_rules_data: 
            register_rules = RegisterRule.objects.create(**data) 
            library.register_rules.add(register_rules) 
        for data in specific_information_data: 
             specific_information = SpecificInformatin.objects.create(**data) 
             library.specific_information.add(specific_information) 
 
        return library 

我认为这段代码适合你。