Django抽象基类与ManyToMany。

4
class Question(models.Model):
    answer_choices = models.ManyToManyField(Answers)

    class Meta:
        abstract = True

class HTMLQuestion(Question):
    question = models.fields.TextField()

class TextQuestion(Question):
    question = models.fields.TextField()

class Quiz(models.Model):
    questions = models.ManyToManyField(Question)

最后一行不起作用。我无法运行python manage.py makemigrations,出现错误“字段定义了与模型'Question'的关系,该模型未安装或是抽象的。”

有没有办法在不使用类型“Question”的情况下拥有Question子类实例的列表? 我想在Quiz中同时使用HTMLQuestion和TextQuestions两种类型。


那么最好您移除 abstract=True - JPG
然后HTMLQuestion和TextQuestion会出问题,而且仍然无法回答如何在Quiz实例中获取HTMLQ和TextQ。 - Back2Basics
3个回答

2

这对我来说可行,因为我需要推导出一个中间模型。谢谢。 - Onyr

2

我的解决方案是在Django中放弃使用继承,而是将类型放入Question中,并在Question模型本身中创建处理该类型的函数。

class Question(models.Model):
    answer_choices = models.ManyToManyField(Answers)
    question_type = models.fields.TextField() # "htmlquestion", "textquestion"
    
    def how_to_deal_with_type(question_type):
        # code here

class Quiz(models.Model):
    questions = models.ManyToManyField(Question)

0

当您将问题模型定义为抽象时,它在迁移期间不会创建表。抽象模型允许您重用实现/字段,但不允许关系。ManyToMany 字段和 ForeignKey 字段需要引用表。在您的情况下,您需要通过创建支持表手动处理多对多关系,该表类似于使用 ManyToMany 字段时 Django 为您创建的表。在您特定的情况下,它应该有四个列:

  • id(自动),
  • quiz(外键),
  • q_type(如果您从 question 派生了每种类型),
  • q_id(保存所引用记录的 id 的整数)。

使用 q_type 获取具体模型,在其中获取 q_id


我不理解由Django控制的支持表的概念。如果它不是由Django控制的,那么我不希望以这种方式进行控制。 - Back2Basics
1
manytomany字段本身就是一个抽象。它只是创建了一个类似于我上面列出的处理关系的表格。字段对象本身是一个容器,为您提供添加/删除/列表等操作。这些操作会转换为对系统表的操作。我的建议是放弃Django提供的自动化层,手动完成。有一个选项可以覆盖ManyToMany字段的实现,但这需要更好地了解框架,鉴于您最初的问题,我认为您要么缺乏这方面的知识,要么不想建立这方面的知识。 - tstoev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接