首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >字段是必需的,即使它在序列化程序中已显式设置为不需要

字段是必需的,即使它在序列化程序中已显式设置为不需要
EN

Stack Overflow用户
提问于 2021-11-09 14:01:39
回答 1查看 29关注 0票数 0

我在创建/更新模型的路线上遇到了一些麻烦,DRF要求提供一个我设置为非必填的字段,并且它一直与其他序列化程序一起工作,但不是一个特殊的序列化程序。

请求(这里的成本计算嵌套对象是我们感兴趣的):

代码语言:javascript
复制
 {
   "building_block_id":"bd750fa0-d41d-492d-adc1-9aa7c50db232",
   "building_block_type_ids":"6fb5b907-9597-45fd-bb77-e93a2456cca3",
   "approbation_user":"",
   "approved":false,
   "name":"BB2",
   "web_doc_link":"",
   "author":"",
   "cms":"",
   "part_number":"",
   "manufacturer":"",
   "description":"T",
   "available_stock":null,
   "include_bench_output_connector":true,
   "base_repository":"",
   "form_factor_id":null,
   "direction_bench_side":null,
   "cost_references":[
      {
         "cost":2,
         "cost_date":"2021-11-03",
         "cost_quantity":2,
         "fab_cycle_time_days":2
      }
   ],
   "coupling":[
      {
         "developped":false,
         "tested":false,
         "validated":false,
         "delivered":false,
         "valid_link":"",
         "implem_link":"",
         "software_version_id":"62f4c9f8-1156-4b41-af1a-22041b824d06"
      }
   ],
   "comments":[
      
   ],
   "features":[
      
   ],
   "provides":[
      
   ],
   "requires":[
      
   ]
}

Django返回的错误:

代码语言:javascript
复制
{
    "coupling": [
        {
            "building_block_id": [
                "This field is required."
            ]
        }
    ]
}

序列化程序类:

代码语言:javascript
复制
class BuildingBlockSerializer(serializers.ModelSerializer):
    cost_references = NestedCostReferenceSerializer(many=True, required=False)
    coupling = NestedCouplingSerializer(many=True, required=False)
    comments = NestedBuildingBlockCommentsSerializer(many=True, required=False)
    features = NestedFeaturesBuildingBlockSerializer(many=True, required=False)
    provides = NestedProvidesSerializer(many=True, required=False)
    requires = NestedRequiresSerializer(many=True, required=False)
    main_picture_link = Base64ImageField(required=False)
    front_picture_link = Base64ImageField(required=False)
    back_picture_link = Base64ImageField(required=False)

    # Related names for reverse relationship
    cost_reference_rel_name = 'cost_references'
    coupling_rel_name = 'coupling'
    comment_rel_name = 'comments'
    feature_rel_name = 'features'
    provide_rel_name = 'provides'
    require_rel_name = 'requires'

    class Meta:
        model = building_blocks.BuildingBlock
        fields = ['building_block_id', 'building_block_type_ids', 'approbation_user',
                  'approved', 'name', 'main_picture_link', 'front_picture_link', 'back_picture_link',
                  'web_doc_link', 'author', 'cms', 'part_number', 'manufacturer', 'description',
                  'available_stock', 'include_bench_output_connector', 'base_repository',
                  'form_factor_id', 'direction_bench_side', 'cost_references', 'coupling',
                  'comments', 'features', 'provides', 'requires']
        optional_fields = ['approved', ]
        extra_kwargs = {'approbation_user': {'required': False},
                        'building_block_type_ids': {'required': False},
                        'approved': {'required': False, 'allow_null': True},
                        'main_picture_link': {'required': False},
                        'front_picture_link': {'required': False},
                        'back_picture_link': {'required': False},
                        'web_doc_link': {'required': False},
                        'author': {'required': False},
                        'cms': {'required': False},
                        'part_number': {'required': False},
                        'manufacturer': {'required': False},
                        'available_stock': {'required': False, 'allow_null': True},
                        'include_bench_output_connector': {'required': False},
                        'base_repository': {'required': False},
                        'form_factor_id': {'required': False, 'allow_null': True},
                        'direction_bench_side': {'required': False, 'allow_null': True}}
...

子序列化程序和嵌套序列化程序:

代码语言:javascript
复制
    class CouplingSerializer(serializers.ModelSerializer):
    class Meta: 
        model = building_blocks.Coupling
        fields = '__all__'


class NestedCouplingSerializer(CouplingSerializer):
    class Meta(CouplingSerializer.Meta):
        extra_kwargs = {
            "building_block_id": {"required": False},
            "building_block_history_id": {"required": False},
        }

耦合模型:

代码语言:javascript
复制
class Coupling(models.Model):
    building_block_id = models.ForeignKey(BuildingBlock, related_name='coupling', on_delete=models.CASCADE)
    software_version_id = models.ForeignKey('SoftwaresVersion', on_delete=models.CASCADE)
    developped = models.BooleanField()
    tested = models.BooleanField()
    validated = models.BooleanField()
    delivered = models.BooleanField()
    valid_link = models.CharField(max_length=256, null=True, blank=True)
    implem_link = models.CharField(max_length=256, null=True, blank=True)

    class Meta:
        unique_together = ['building_block_id', 'software_version_id']

在删除unique_together变量时,它工作得很好。我希望保留此设置,但使验证通过。

我尝试将验证器设置为[],但无济于事。

EN

回答 1

Stack Overflow用户

发布于 2021-11-09 16:01:15

改变

代码语言:javascript
复制
unique_together = ['building_block_id', 'software_version_id']

代码语言:javascript
复制
constraints = [models.UniqueConstraint(fields=['building_block_id', 'software_version_id'], name='unique_coupling')]

删除了限制,可能是由于DRF对unique_together字段进行了一些验证。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69899534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档