我想给一个ForeignKey或者ManytoManyField添加更多的约束条件,像这样。
question_id = models.ManyToManyField(Question(open==True))
或者再加一个类似的约束条件。
事实上,我不想显示一个没有打开的问题(在Answer表单中加高,如上图),当然,我已经通过一些查询来实现了,但是Django有任何内置的支持吗?我也试过其他的方法,但是没有用。谢谢!我有一个关于Django的问题。
class Answer(models.Model):
"""Give answers"""
answer = models.TextField()
question_id = models.ManyToManyField(Question(open==True))
upVote = models.IntegerField(default=0)
downVote = models.IntegerField(default=0)
def __str__(self):
"""return string """
return self.answer
趁着现在还可以,改变你的模型关系。你现在的情况是,一个答案可以链接到多个问题。然而,答案包含了向上和向下的投票。
所以,我可以创建两个问题。
我可以把 "是 "和 "不是 "这两个问题的答案联系起来,只要有好的接口就可以方便,而且是规范化的。但是 他们将 分享升压票. 相反,答案应该有一个外键到问题,因为一个答案一次只能链接到一个问题,即使答案文字相同也要防止上下票共享。
其次,我们一般不把字段命名为 question_id
但 question
:从对象关系的角度来看,你把一个问题的答案与一个问题的id联系起来,而不是与一个问题的id联系起来(兜底。question_id
是为了加快查询速度,并作为基础数据库表中的字段名)。)
在你的实际问题上:你想限制可用的选择,这正是 limit_choices_to
为你做的。所以你最终会得到这样的结果。
class Answer(models.Model):
"""Give answers"""
answer = models.TextField()
question = models.ForeignKey(
Question, on_delete=models.CASCADE, related_name='answers',
limit_choices_to={'open': True},
)
upVote = models.IntegerField(default=0)
downVote = models.IntegerField(default=0)
def __str__(self):
"""return string """
return self.answer
# Serializer
class AnswerSerializer(serializers.ModelSerializer)
class Meta:
model = Answer
fields = ('answer', 'upVote', 'downVote', 'question_id')
如你所见,你的序列化器可以引用神奇的字段。question_id
.