【发布时间】: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