尝试在 Django 中创建一个带有外键列表的 PostgreSQL 字段
Trying to make a PostgreSQL field with a list of foreign keys in Django
这是我正在尝试做的事情:
在 Django 中创建一个模型,它是一个 PostgreSQL 数组(数据库特定类型),其中包含另一个模型的外键。
class Books(models.Model):
authors = ArrayField(
models.ForeignKey('my_app.Authors', default=None, null=True, blank=True),
blank=True,
default=list()
)
当我尝试 makemigrations 时,Django 给我这个错误:
SystemCheckError: System check identified some issues:
ERRORS:
my_app.Books.authors: (postgres.E002) Base field for array cannot be a related field.
关于如何打败它的任何想法?
您不能创建外键数组。这不是 Django 的限制,而是 PostgreSQL 的“限制”。
原因是外键不是类型,it is a constraint on a field。外键数组没有任何意义。
实现此目的的一般方法是使用一个中间 table,它将用作两个其他 link 之间的 link :
Authors(id, name)
Books(id, title, pub_date)
BookAuthors(id, book_id, author_id)
在上面的例子中,BookAuthors.book_id
是Books.id
的外键,BookAuthors.author_id
是Authors.id
的外键。因此,table BookAuthors
用于匹配作者和书籍,反之亦然。
Django 用 ManyToManyField
fields:
抽象了这个中间体 table
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 将创建中间体 table。
然后,您可以使用 book.authors.all()
获取一本书的所有作者,或者使用 author.authored_books.all()
.
获取某位作者创作的所有书籍
您必须使用ManyToManyField
,ArrayField
不能与其他模型关联。
这是我正在尝试做的事情: 在 Django 中创建一个模型,它是一个 PostgreSQL 数组(数据库特定类型),其中包含另一个模型的外键。
class Books(models.Model):
authors = ArrayField(
models.ForeignKey('my_app.Authors', default=None, null=True, blank=True),
blank=True,
default=list()
)
当我尝试 makemigrations 时,Django 给我这个错误:
SystemCheckError: System check identified some issues:
ERRORS:
my_app.Books.authors: (postgres.E002) Base field for array cannot be a related field.
关于如何打败它的任何想法?
您不能创建外键数组。这不是 Django 的限制,而是 PostgreSQL 的“限制”。
原因是外键不是类型,it is a constraint on a field。外键数组没有任何意义。
实现此目的的一般方法是使用一个中间 table,它将用作两个其他 link 之间的 link :
Authors(id, name)
Books(id, title, pub_date)
BookAuthors(id, book_id, author_id)
在上面的例子中,BookAuthors.book_id
是Books.id
的外键,BookAuthors.author_id
是Authors.id
的外键。因此,table 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 将创建中间体 table。
然后,您可以使用 book.authors.all()
获取一本书的所有作者,或者使用 author.authored_books.all()
.
您必须使用ManyToManyField
,ArrayField
不能与其他模型关联。