Как лучше всего смоделировать что-то подобное в Django?

введите описание изображения здесь
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)

Это приводит к отношениям OneToMany и ManyToOne

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)

Это приводит к отношениям OneToMany, ManyToOne, OneToOne (с неподходящим отношением ManyToOne)

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="+")

Это самое близкое, что я хочу, но есть ли лучший способ?

€ dit: Автор -> Книга должна быть 1; *, а не 0; * но не относится к этому вопросу


ОБНОВИТЬ:

Это сработало для меня:

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)

Спасибо @giaco

1
Speedy 6 Апр 2017 в 09:58

2 ответа

Лучший ответ

Книга и автор - это отношения ManyToMany, в то время как книга может иметь более одного автора, а автор может написать более одной книги. Поэтому вам нужна таблица AuthorBook, в которой у вас есть записи с идентификаторами Book и Author.

1
Jan Giacomelli 6 Апр 2017 в 07:58

Вы должны иметь посредническая модель между автором и книгой:

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)
1
Leonardo Chirivì 6 Апр 2017 в 07:56