2017-04-06 4 views
1

Was ist der beste Weg, um so etwas in Django zu modellieren?Django Relation

enter image description here
1)

class Book(models.Model): 
    name = models.CharField(max_length=100) 


class Author(models.Model): 
    name = models.CharField(max_length=100) 
    book = models.ForeignKey(Book) 

Dies führt zu einer OneToMany und eine ManyToOne Beziehung

2)

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    author = models.OneToOneField("Author", related_name="author") 


class Author(models.Model): 
    name = models.CharField(max_length=100) 
    book = models.ForeignKey(Book) 

Dies führt zu einer OneToMany, ManyToOne, OneToOne Beziehung (mit einer Unescoary ManyToOne Beziehung)

3)

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    author = models.OneToOneField("Author", related_name="+") 


class Author(models.Model): 
    name = models.CharField(max_length=100) 
    book = models.ForeignKey(Book, related_name="+") 

Dies ist der nächste, was ich will, aber gibt es einen besseren Weg?

€ dit: Autor -> Buch sollte 1 sein; *, nicht 0; * Aber für diese Frage nicht relevant


UPDATE:

die für mich gearbeitet:

class Book(models.Model): 
    name = models.CharField(max_length=100) 


class Author(models.Model): 
    name = models.CharField(max_length=100) 
    books = models.ManyToManyField(Book, through="AuthorBook") 


class AuthorBook(models.Model): 
    book = models.OneToOneField(Book) 
    author = models.ForeignKey(Author) 

Sie

+0

völlig abhängig von Ihren Anforderungen an die Anwendung haben – Charlesliam

+0

Ihr Diagramm ist unklar. Die erste Option ist der richtige Weg, diese Beziehung zu modernisieren. Warum willst du ein extra eins zu eins? –

+0

In Worten: Ein Buch hängt hat einen Autor (OneToOne) One, genauen Autor eine bis n Books (OneToMany) Die erste Lösung, die eine OneToMany Beziehung vom Autor Seite und eine ManyToOne Beziehung aus dem Buch Seite erstellt – Speedy

Antwort

1

Buch und Autor ist ManyToMany-Beziehung, während Buch mehr als einen Autoren haben kann und Autor mehr als ein Buch schreiben kann. Daher benötigen Sie Tabelle AuthorBook, in dem Sie Datensätze mit Buch und Autoren-IDs

1

@giaco danken Sie sollten eine intermediary model zwischen Autor und Buch haben:

class Author(models.Model): 
    name = models.CharField(max_length=100) 

class Book(models.Model): 
    name = models.CharField(max_length=100) 
    author = models.ManyToManyField(Person, through='AuthorBook') 

class AuthorBook(models.Model): 
    author = models.ForeignKey(Author, on_delete=models.CASCADE) 
    book = models.ForeignKey(Book, on_delete=models.CASCADE) 
+0

Danke, das kommt wirklich nah an was ich brauchte, aber @giaco war ein bisschen schneller :) – Speedy