django模型参考,添加更多约束

时间:2020-06-02 03:33:38

标签: django model foreign-keys manytomanyfield

enter image description here我对Django模型引用有疑问。

我想像这样向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

1 个答案:

答案 0 :(得分:1)

尽管您仍然可以更改模型关系。您现在拥有的答案是可以链接到多个问题。但是,答案包含上下投票。

所以我可以创建两个问题:

  1. 1 + 1是两个吗?
  2. 1 + 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

相关问题