gpt4 book ai didi

django - 指定现有 ManyToMany "through table"关系之一的最佳方法?

转载 作者:行者123 更新时间:2023-12-03 21:42:49 26 4
gpt4 key购买 nike

我有图书馆数据库的这些模型:

class Author(models.Model):
...

class Task(models.Model):
... # detailed explanation of how the author collaborated in the book

class BookTask(models.Model):
book = models.ForeignKey(Book)
author = models.ForeignKey(Author)
task = models.ForeignKey(Task)

class Book(models.Model):
authors = models.ManyToManyField(Author, through='BookTask'...)

一切正常,但我想将现有的 BookTask 关系之一指定为主要关系。想想一本书,其中有 3 位作者。我想将所有 3 位作者都分配给这本书,然后将其中 1 位设置为主要作者。

我已经试过了:

class Book(models.Model):
authors = models.ManyToManyField(Author, through='BookTask'...)
author_main = models.ForeignKey(BookTask...)

但是随后生成的管理网页并未显示 author_main 字段的预期选择小部件。有什么想法吗?

(注意:我目前的解决方案是在 BookTask 模型中添加一个 bool 字段以指定哪个是主要的,并通过表单验证控制一本书中只有一个是选择。它有效,但也许有更优雅的解决方案)。

最佳答案

一方面作者/书籍与另一方面任务之间的关系是 1:1 的吗?如果是,从数据库管理的角度来看,您添加 BooleanField 的解决方案是最佳的。你在那边的任何其他外键,如 author_main 都会弄乱数据库模式。

如果关系是一对多任务(一个作者可以在同一本书上有多个任务),我会这样做:

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

class AuthorBookTask(models.Model):
author_book = models.ForeignKey(AuthorBook)
task = models.ForeignKey(Task)

这样您首先指定作者身份,然后将任务映射到该作者身份。

尽管如此,您还需要一些规则来指定每本书只能有一位主要作者。以下 SQL 查询应返回小于或等于 1 的结果:

select sum(primary_author)
from AuthorBook
group by book

希望这有助于...

关于django - 指定现有 ManyToMany "through table"关系之一的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47366683/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com