我想像这样向ForeignKey或ManytoManyField添加更多约束:
question_id = models.ManyToManyField(Question(open==True))
或设置另一个类似的约束条件:
实际上,我不想显示未作为选择项打开的问题(如上图所示,在“答案”表单中突出显示), 当然,我已经通过一些查询完成了,但是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
答案 0 :(得分:1)
尽管您仍然可以更改模型关系。您现在拥有的答案是可以链接到多个问题。但是,答案包含上下投票。
所以我可以创建两个问题:
我可以将答案“是”和“否”链接到两个问题,这可以通过一个良好的界面方便并进行标准化。 但是,他们将分享上下投票。相反,答案应该具有问题的外键,因为即使答案文本相同,也只能一次将一个问题链接到一个问题,以防止共享上下投票。
第二,我们通常不命名字段question_id
,而是命名question
:
从对象关系的角度来看,您将问题的答案与问题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
。