1

我按照 djangobook 在线第 5 章http://www.djangobook.com/en/2.0/chapter05/,有一个带有 Publisher、Author 和 Book 的书籍模型。但是似乎他们没有提到如何为包含与Publisher和Author的复杂关系一对多和多对多的图书模型添加数据,所以我尝试自己做,但遇到了一些问题。

图书型号:

class Book(models.Model):
    title = models.CharField(max_length=100)
    authors = models.ManyToManyField(Author)
    publisher = models.ForeignKey(Publisher)
    publication_date = models.DateField()

这是发布者:

p = Publisher.objects.get(id=1)

这是作者:

a = Author.objects.get(id=1)

根据这个链接https://docs.djangoproject.com/en/dev/topics/db/examples/many_to_many/,我决定先创建书,然后再添加作者:

b = Book(title='Django for dummy', publisher=p, datetime.datetime.now())

发生错误:语法错误:关键字 arg 之后的非关键字 arg

谁能指出我正确的方法?谢谢

4

2 回答 2

3

在 python 中,后置 args 必须放在关键字 args 之前。publication_date=datetime.datetime.now()在传递论点时做。

于 2012-09-17T06:58:08.130 回答
2

你的电话是形式

b = foo(bar="test", "baz")

你不能那样做。想象一下 foo 是这样定义的

def foo(size, weight, bar):
...

当 Python 试图调用foo它时,它不能。因为在我的示例中,Python 不知道要分配"baz"给哪个参数。这不是weight因为自从您开始使用关键字 arg(bar="test"或任何带有关键字和值的东西)以来,位置就没有任何意义。它可以分配"baz"到,weight因为它是第二个参数,但这意味着这size是第一个参数,并且您已经明确声明它不是。

当您构建这样的对象时,基本上只需使用关键字参数。

通常,您可以通过将所有参数设置为关键字或所有位置或将位置参数放在首位来解决此错误。我会做其中的第一个:

b = Book(title='Django for dummy', publisher=p, publication_date=datetime.datetime.now())
于 2012-09-17T06:57:29.877 回答