Django - Eingabe in der shell bei many-to-many relation

Django, Flask, Bottle, WSGI, CGI…
Antworten
Grumpy Cat
User
Beiträge: 7
Registriert: Donnerstag 18. Juli 2019, 07:56

Guten Morgen,

ich beschäftige mich derzeit mit der many-to-many-Beziehung in Django. Im Admin-Panel klappt die Eingabe von Daten, nun möchte ich das auch mit der python-shell machen. Hier habe ich aber Probleme. Mein Model sieht wie folgt aus:

Code: Alles auswählen

from django.db import models

class Book(models.Model):
    title = models.CharField(max_length=255)
    authors = models.ManyToManyField("Author", related_name="books")

    def __str__(self):
        return self.title

class Author(models.Model):
    name = models.CharField(max_length=255, unique=True)

    def __str__(self):
        return self.name
Mein Ansatz ist wäre):

Code: Alles auswählen

from books.models import Author, Book
book1 = Book(title='Python unchained', authors='Guido van Rossum')
Dies führt zu der Fehlermeldung:

Code: Alles auswählen

TypeError: Direct assignment to the forward side of a many-to-many set is prohibited. Use authors.set() instead
Könnt ihr mir sagen, wie die korrekte Eingabe lautet, wenn ich obigem Buch 1 Autor zuordnen möchte und wenn ich 2 Autoren zuordnen möchte?

LG
Kerstin
Bolitho
User
Beiträge: 219
Registriert: Donnerstag 21. Juli 2011, 07:01
Wohnort: Stade / Hamburg
Kontaktdaten:

siehe hier:
https://docs.djangoproject.com/en/2.2/t ... y_to_many/

Code: Alles auswählen

from books.models import Author, Book
book1 = Book(title='Python unchained')
book1.save()
book1.authors.add(Author.objects.get(name="Guido van Rossum"))

Code: Alles auswählen

# zwei Autoren
book1.authors.add(Author.objects.get(name="Guido van Rossum"), Author.objects.get(name="2nd Author"))
Zuletzt geändert von Bolitho am Donnerstag 18. Juli 2019, 09:26, insgesamt 1-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Many to Many bedeutet ja, dass ein Buch mehrere Autoren und ein Autor mehrere Bücher haben kann. Deshalb kannst du da nicht einfach eine Zeichenkette reinschreiben. Stell dir mal vor, du würdest noch den Geburtstag des Autors in Author speichern. Woher soll Django denn wissen, wohin das gespeichert werden soll?

Du musst also Instanzen von Author dort einfügen.

Wie das geht, steht hier.
Grumpy Cat
User
Beiträge: 7
Registriert: Donnerstag 18. Juli 2019, 07:56

Hey ihr beiden,

vielen Dank für eure Antworten/Links. Problem ist gelöst und ich habe einiges dazugelernt.

LG
Antworten