10

Đây là những gì tôi đang cố gắng thực hiện: Tạo mô hình trong Django là mảng PostgreSQL (kiểu cơ sở dữ liệu cụ thể), có chứa khóa ngoài mô hình.Cố gắng tạo một trường PostgreSQL với danh sách khóa ngoài ở Django

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

Khi tôi cố gắng makemigrations, Django mang lại cho tôi lỗi này:

SystemCheckError: System check identified some issues:

ERRORS:

my_app.Books.authors: (postgres.E002) Base field for array cannot be a related field.

Bất kỳ ý kiến ​​về việc làm thế nào để đánh bại đó?

+0

Bạn nên sử dụng trường 'ManyToMany' cho mục đích này. – Selcuk

Trả lời

10

Bạn không thể tạo một dãy khóa ngoại. Nó không phải là một giới hạn Django, nó là một "giới hạn" của PostgreSQL.

Lý do là khóa ngoại không phải là một loại, đó là một ràng buộc trên một trường. Một mảng các khóa ngoại không gây ra bất kỳ cảm giác nào.

Cách tiếp cận chung để đạt được điều này là sử dụng một bảng trung gian sẽ được sử dụng như một mối liên hệ giữa hai người khác:

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

Trong dụ trên, BookAuthors.book_id là khóa ngoại để Books.idBookAuthors.author_id là một khóa ngoại đến Authors.id. Do đó, bảng BookAuthors được sử dụng để đối sánh tác giả với sách và ngược lại.

Django tóm tắt bảng trung gian này với 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') 

Đằng sau hậu trường, Django sẽ tạo ra các bảng trung gian.

Sau đó, bạn có thể lấy tất cả tác giả sách bằng cách sử dụng book.authors.all() hoặc tất cả các sách do tác giả sử dụng author.authored_books.all().

+0

Điều này có ý nghĩa. Cảm ơn bạn! Thay vào đó, tôi sẽ chỉ sử dụng các giá trị không phải là khóa ngoại. Tôi hơi lo lắng về hiệu suất và chỉ có vôi tôi cần những phím liên quan là khi tôi chọn đối tượng này chính nó. – Danil

+0

Tôi nghĩ bạn vẫn nên quan hệ nhiều-nhiều. Tôi bạn thiết lập một loạt các số nguyên, có thể bạn sẽ gặp rất nhiều rắc rối. Đặc biệt là về tính toàn vẹn dữ liệu. Tôi không thể thấy vấn đề với hiệu suất. –

0

Bạn phải sử dụng ManyToManyField, ArrayField không thể liên quan với một mô hình khác.

Các vấn đề liên quan