10

Oto, co próbuję zrobić: Stwórz model w Django, który jest tablicą PostgreSQL (typ bazy danych), który zawiera klucze obce do innego Model.Próba utworzenia pola PostgreSQL z listą kluczy obcych w Django

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

Kiedy próbuję makemigrations Django daje mi ten błąd:

SystemCheckError: System check identified some issues:

ERRORS:

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

jakieś pomysły w jaki sposób pokonać, że?

+0

Do tego celu powinieneś użyć pola 'ManyToMany'. – Selcuk

Odpowiedz

10

Nie można utworzyć tablicy kluczy obcych. To nie jest ograniczenie Django, jest "ograniczeniem" PostgreSQL.

Powód jest taki, że klucz obcy nie jest typem, jest ograniczeniem na polu. Tablica kluczy obcych nie ma żadnego sensu.

Ogólne podejście do osiągnięcia tego celu jest użycie stół pośredni, który będzie używany jako łącznik między dwoma innymi:

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

W powyższym exemple, BookAuthors.book_id jest kluczem obcym do Books.id i BookAuthors.author_id jest klucz obcy do Authors.id. Tak więc tabela BookAuthors służy do dopasowania autora do książki i na odwrót.

Django abstrahuje tę pośrednią tabelę z 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') 

Za kulisami Django utworzyć tabelę pośrednią.

Następnie można uzyskać wszystkich autorów książki za pomocą book.authors.all() lub wszystkich książek autorstwa autora przy użyciu author.authored_books.all().

+0

To ma sens. Dziękuję Ci! Zamiast tego użyję wartości nie jako klucza obcego. Jestem nieco zaniepokojony osiągami i jedynym wapnem, którego potrzebuję, są te klucze, kiedy wybieram ten obiekt sam. – Danil

+0

Myślę, że powinieneś nadal mieć relację wiele do wielu. Ustawiłeś tablicę liczb całkowitych, prawdopodobnie będziesz mieć wiele problemów. Szczególnie w kwestii integralności danych. Nie widzę problemu z wydajnością. –

0

Należy użyć ManyToManyField, ArrayField nie może być powiązany z innym modelem.