10

Hier ist, was ich versuche zu tun: Erstellen Sie ein Modell in Django, die ein PostgreSQL-Array (datenbankspezifischen Typ) ist, die Fremdschlüssel zu einem anderen enthält Modell.Versuchen, ein PostgreSQL-Feld mit einer Liste von Fremdschlüsseln in Django zu erstellen

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

Als ich makemigrations versuchen, gibt Django mir diesen Fehler:

SystemCheckError: System check identified some issues:

ERRORS:

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

Irgendwelche Ideen auf, wie das schlagen?

+0

Sie sollten zu diesem Zweck ein 'ManyToMany'-Feld verwenden. – Selcuk

Antwort

10

Sie können kein Array mit Fremdschlüsseln erstellen. Es ist keine Django-Beschränkung, es ist eine PostgreSQL-Beschränkung.

Der Grund ist, dass ein Fremdschlüssel kein Typ ist, es ist eine Einschränkung für ein Feld. Ein Array von Fremdschlüsseln macht kein Sens.

Der allgemeine Ansatz, um dies zu erreichen, ist eine Zwischentabelle zu verwenden, die als Verbindung zwischen zwei anderen verwendet werden werden:

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

In der obigen exemple ist BookAuthors.book_id ein Fremdschlüssel für Books.id und BookAuthors.author_id a Fremdschlüssel zu Authors.id. Daher wird die Tabelle BookAuthors verwendet, um einen Autor mit einem Buch zu vergleichen und umgekehrt.

Django abstrahiert diese Zwischentabelle mit 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') 

Hinter den Kulissen wird Django die Zwischentabelle erstellen.

Dann können Sie alle Autoren eines Buches mit book.authors.all(), oder alle Bücher von einem Autor mit author.authored_books.all() verfasst bekommen.

+0

Das macht Sinn. Vielen Dank! Ich verwende stattdessen die Werte nicht als Fremdschlüssel. Ich bin etwas besorgt über die Leistung und die einzige Limes, die ich brauche diese verwandten Schlüssel ist, wenn ich dieses Objekt selbst auswählen. – Danil

+0

Ich denke du solltest noch eine Viele-zu-Viele-Beziehung haben. Wenn Sie eine Reihe von Ganzzahlen festlegen, werden Sie wahrscheinlich in viele Schwierigkeiten geraten. Insbesondere zur Datenintegrität. Ich kann das Problem mit der Leistung nicht sehen. –

0

Sie müssen verwenden ManyToManyField, ArrayField kann nicht mit einem anderen Modell verwandt werden.