【问题标题】:django model reference, Add more contraint to referencedjango 模型参考,添加更多约束参考
【发布时间】:2020-09-20 11:16:33
【问题描述】:

我有一个关于 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

【问题讨论】:

  • 你能给我们看一下序列化器吗?

标签: django model foreign-keys manytomanyfield


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-30
    • 2020-08-28
    • 2019-04-23
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多