簡體   English   中英

django-rest-framework 訪問序列化器內部的字段

[英]django-rest-framework access field inside serializer

所以我有一個像這樣的 model

class DataSheet(BaseModel):
    """
    Represents a single dataSheet.
    dataSheets have their own model at the core. Model data is added to
    the dataSheets in the form of separate records.
    """

    class Meta:
        verbose_name = 'datasheet'
        verbose_name_plural = 'datasheets'
        ordering = ['position', 'cluster']
        required_db_features = {
            'supports_deferrable_unique_constraints',
        }
        constraints = [
            models.UniqueConstraint(
                fields=['position', 'cluster'],
                name='deferrable_unique_datasheet_position',
                deferrable=models.Deferrable.DEFERRED
            )
        ]

    def __str__(self):
        return self.name

    objects = managers.DataSheetsManager()
    positions = managers.PositionalManager()
    position = models.PositiveSmallIntegerField(db_index=True, editable=True)
    name = models.CharField(max_length=100, validators=[MinLengthValidator(2)], db_index=True)
    description = models.CharField(max_length=1024, null=True, blank=True, db_index=True)
    owner = models.ForeignKey('api_backend.Member', on_delete=models.CASCADE, db_index=True, editable=False)
    fields = models.ManyToManyField('api_backend.Field')
    overwrites = models.ManyToManyField('api_backend.RoleOverwrite')
    parent = models.ForeignKey('api_backend.Category', on_delete=models.CASCADE, null=True, blank=True)
    cluster = models.ForeignKey('api_backend.Cluster', on_delete=models.CASCADE, editable=False)

    REQUIRED_FIELDS = [name, owner, cluster]

和這樣的序列化程序

class DataSheetSerializer(serializers.ModelSerializer):
    """
    A serialized DataSheet Object.
    Datasheets have their own:
        - array of fields
        - array of role-overwrites
    """

    def get_fields(self):
        fields = super(DataSheetSerializer, self).get_fields()
        fields['parent'].queryset = self.cluster.categories.all()

        return fields

    class Meta:
        model = DataSheet
        read_only_fields = ['position']
        fields = '__all__'

    # need to make sure that the parent category of the datasheet
    # belongs to the datasheet's cluster only.

    fields = partial.PartialFieldSerializer(many=True, read_only=True)
    overwrites = partial.PartialOverWriteSerializer(many=True, read_only=True)

問題是,我想在 get_fields 方法中訪問序列化模型的cluster字段。 但是,我不能這樣做。 有人能幫我嗎?

我已經看到其他涉及 initial_data 的答案,但這在這里不起作用。

fields['parent'].queryset = self.cluster.categories.all()

cluster 在這里是一個未解決的參考。

get_fields中的selfDataSheetSerializer實例而不是DataSheet model 實例。 因此它不應該具有集群屬性。 您無法在get_fields中訪問 model DataSheet實例,因為它從 class DataSheet而非其實例中獲取字段。 你可以像這樣驗證字段

class DataSheetSerializer(serializers.ModelSerializer):
    # ... other code

    def validate(self, data):
         parent = data.get('parent')
         # check if parent is valid i.e in queryset
         # if yes return data
         # else raise serializers.validationError

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM