Что определяет, какие поля могут быть обновлены в DjangoRestFramework - PullRequest
0 голосов
/ 08 ноября 2018

В настоящее время у меня есть сериализатор со следующими полями

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'
              )

Serializer

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",)

View

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 в форме UPDATE/PUT отображаются только 4 поля, как показано на рисунке ниже. enter image description here

В чем может быть причина того, что некоторые другие поля здесь не отображаются. Что определяет, какие поля являются обновляемыми ??

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Что ж, проблема в том, что при установке глубины = 1 ModelSerializer пытается сгенерировать поле NestedSerializer для любого поля, связанного с внешним ключом, которое вы явно не упомянули. И это поле NestedSerializer является полем только для чтения. Вот почему местоположение объекта не отображается. Удалите эту строку глубиной = 1, и DRF отобразит указанное поле с отображением по умолчанию, т.е. PrimaryKeyRelatedFiel, и вы увидите, что указанное поле отображается.

0 голосов
/ 08 ноября 2018

В вашей модели вы делаете editable=False для многих полей. Эти поля не будут отображаться. Если вы хотите отобразить и отредактировать это поле, удалите эту опцию. За дополнительной информацией обращайтесь вопрос

...