代码之家  ›  专栏  ›  技术社区  ›  E_K

什么决定了DjangoRestFramework中哪些字段可以更新

  •  0
  • E_K  · 技术社区  · 6 年前

    我目前有一个序列化程序,其中包含以下字段

    class Meta:
        model = Asset
        fields = ('id', 'uuid', 'asset_category', 'asset_sub_category',
                  'make_label',
                  'asset_code', 'serial_number', 'model_number',
                  'checkin_status', 'created_at',
                  'last_modified', 'current_status', 'asset_type',
                  'allocation_history', 'specs', 'purchase_date',
                  'notes', 'assigned_to', 'asset_location'
                  )
    

    序列化程序

    class AssetSerializer(serializers.ModelSerializer):
        checkin_status = serializers.SerializerMethodField()
        allocation_history = serializers.SerializerMethodField()
        assigned_to = UserSerializer(read_only=True)
        asset_category = serializers.SerializerMethodField()
        asset_sub_category = serializers.SerializerMethodField()
        make_label = serializers.SerializerMethodField()
        asset_type = serializers.SerializerMethodField()
        model_number = serializers.SlugRelatedField(
            queryset=AssetModelNumber.objects.all(),
            slug_field="model_number"
        )
    
        class Meta:
            model = Asset
            fields = ('id', 'uuid', 'asset_category', 'asset_sub_category',
                      'make_label',
                      'asset_code', 'serial_number', 'model_number',
                      'checkin_status', 'created_at',
                      'last_modified', 'current_status', 'asset_type',
                      'allocation_history', 'specs', 'purchase_date',
                      'notes', 'assigned_to', 'asset_location'
                      )
            depth = 1
            read_only_fields = ("uuid",)
    

    看法

    class ManageAssetViewSet(ModelViewSet):
        serializer_class = AssetSerializer
        queryset = Asset.objects.all()
        # permission_classes = [IsAuthenticated, IsAdminUser]
        # authentication_classes = (FirebaseTokenAuthentication,)
        http_method_names = ['get', 'post', 'put', 'delete']
        filter_backends = (filters.DjangoFilterBackend,)
        filterset_class = AssetFilter
    
        def get_object(self):
            queryset = Asset.objects.all()
            obj = get_object_or_404(queryset, uuid=self.kwargs['pk'])
            return obj
    

    资产模型。一些领域已被重新命名

    class Asset(models.Model):
        """Stores all assets"""
        uuid = models.UUIDField(unique=True, default=uuid.uuid4, editable=False)
        asset_code = models.CharField(
            unique=True, null=True, blank=True, max_length=50)
        serial_number = models.CharField(
            unique=True, null=True, blank=True, max_length=50)
        created_at = models.DateTimeField(auto_now_add=True, editable=False)
        asset_location = models.ForeignKey('AndelaCentre', blank=True, editable=True, null=True,
                                           on_delete=models.PROTECT)
        purchase_date = models.DateField(
            validators=[validate_date],
            null=True, blank=True)
        last_modified = models.DateTimeField(auto_now=True, editable=False)
        assigned_to = models.ForeignKey('AssetAssignee',
                                        blank=True,
                                        editable=False,
                                        null=True,
                                        on_delete=models.PROTECT)
        model_number = models.ForeignKey(AssetModelNumber,
                                         null=True,
                                         on_delete=models.PROTECT)
        current_status = models.CharField(editable=False, max_length=50)
        notes = models.TextField(editable=False, default=" ", )
    

    但是,在可浏览的Api上,只有4个字段显示在 UPDATE/PUT 形式如下图所示 enter image description here

    其他一些领域没有出现在这里的原因可能是什么。什么决定了哪些字段是可更新的??

    2 回复  |  直到 6 年前
        1
  •  1
  •   Dipendra bhatt    6 年前

    问题是,当您设置depth=1时,ModelSerializer会尝试为您没有明确提到的任何foreignkey相关字段生成NestedSerializer字段。NestedSerializer字段是只读字段。这就是为什么不显示Assest位置。删除depth=1行,DRF将用默认映射(即PrimaryKeyRelatedFiel)映射所述字段,您将看到所述字段被显示。

        2
  •  0
  •   a_k_v    6 年前

    在你的模型里 editable=False 在许多领域。字段不会显示。如果要显示和编辑该字段,请删除该选项。 question