【问题标题】:Django REST Framework - nested serializer validation?Django REST Framework - 嵌套序列化程序验证?
【发布时间】:2018-07-06 00:21:34
【问题描述】:

所以我有这样的模型:

class Leaderboard(models.Model):
    pass


class Column(models.Model):
    leaderboard = models.ForeignKey(Leaderboard, related_name="columns", on_delete=models.CASCADE)
    related_columns = models.ManyToManyField(self)
    index = models.PositiveIntegerField()

还有像这样的序列化器:

class ColumnSerializer(ModelSerializer):
    related_columns = serializers.PrimaryKeyRelatedField(queryset=Column.objects.all(), many=True)

    class Meta:
        model = Column
        fields = ('leaderboard', 'related_columns', 'index',)


class LeaderboardSerializer(ModelSerializer):
    children = ColumnSerializer(many=True)

    class Meta:
        model = Leaderboard
        fields = ('columns',)

所以我想做的是验证为ColumnSerializer 添加到related_columns 的任何列是否已经属于其Leaderboard 父级。在创建ColumnSerializer 进行验证期间,我曾多次尝试访问排行榜或排行榜ID(例如通过在字段中手动指定id),但LeaderboardSerializer` 未在Column 之前初始化,因此我无法验证详细信息。

基本上,我想将queryset=Column.objects.all()修改为queryset=self.instance.leaderboard.columns.all()

但是我无法访问 Column 内的 Leaderboard。例如,如果我在ColumnSerializer 内部访问self.parent.instance/initial,它是None,直到在Leaderboard.validate_columns() 内部。我想到的一件事是只在排行榜方面进行验证,但我仍然认为在 Column 内进行此验证应该是“可行的”,以防我想直接编辑它们,而无需先通过Leaderboard...

【问题讨论】:

  • 我认为这就是基本验证方法的用途。由于您的 related_columns 验证需要了解另一个字段,因此请在此处进行检查。
  • 你找到方法了吗?我也在考虑根据父级的信息验证子级序列化程序。
  • @FMCorz 在下面发布了我的答案!

标签: django django-rest-framework


【解决方案1】:

我是这样解决这个问题的:

def validate_columns(self, columns):
    if not columns:
        raise serializers.ValidationError("Leaderboards require at least 1 column")

    # Make sure all column indexes are unique
    indexes = [column['index'] for column in columns]
    if len(set(indexes)) != len(columns):
        raise serializers.ValidationError("Columns must have unique indexes!")

    # Make sure all column keys are unique
    keys = [column["key"] for column in columns]
    if len(set(keys)) != len(columns):
        raise serializers.ValidationError("Columns must have unique keys!")

    # Validate that column.computation_indexes points to valid columns
    for column in columns:
        if 'computation_indexes' in column and column['computation_indexes']:
            for index in column['computation_indexes'].split(","):
                try:
                    if int(index) not in indexes:
                        raise serializers.ValidationError(f"Column index {index} does not exist in available indexes {indexes}")
                except ValueError:
                    raise serializers.ValidationError(f"Bad value for index, should be an integer but received: {index}.")

    return columns

我确保列是唯一的(在它们的键和索引中)并且它们引用的列也存在。

【讨论】:

    猜你喜欢
    • 2016-11-21
    • 2018-07-07
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多