试图在Django中创建一个带有外键列表的PostgreSQL字段

时间:2016-03-12 12:50:56

标签: django postgresql django-models django-orm django-migrations

以下是我要做的事情: 在Django中创建一个PostgreSQL数组(数据库特定类型)的模型,它包含另一个模型的外键。

class Books(models.Model):
authors = ArrayField(
    models.ForeignKey('my_app.Authors', default=None, null=True, blank=True),
    blank=True,
    default=list()
)

当我尝试制作游戏时,Django给了我这个错误:

  

SystemCheckError:系统检查发现了一些问题:

     

错误:

     

my_app.Books.authors:(postgres.E002)数组的基本字段不能是相关字段。

关于如何击败它的任何想法?

2 个答案:

答案 0 :(得分:14)

您无法创建外键数组。它不是Django的限制,它是PostgreSQL的“限制”。

原因是外键不是类型,它是字段的约束。一系列外键没有任何感觉。

实现这一目标的一般方法是使用一个中间表,用作两个其他人之间的链接:

Authors(id, name)
Books(id, title, pub_date)
BookAuthors(id, book_id, author_id)

在上面的示例中,BookAuthors.book_idBooks.id的外键,BookAuthors.author_idAuthors.id的外键。因此,表BookAuthors用于将作者与书籍匹配,反之亦然。

Django使用ManyToManyField fields

抽象出这个中间表
class Authors(models.Model):
    name = models.CharField(...)

class Books(models.Model):
    title = models.CharField(...)
    pub_date = models.DateField(...)
    authors = models.ManyToManyField('my_app.Authors',
                                     related_name='authored_books')

在幕后,Django将创建中间表。

然后,您可以使用book.authors.all()获取图书的所有作者,或使用author.authored_books.all()撰写作者撰写的所有图书。

答案 1 :(得分:0)

您必须使用ManyToManyFieldArrayField无法与其他模型相关联。