混淆了djangobook中的Models示例

时间:2012-09-17 06:25:34

标签: python django

我按照djangobook在线第5章http://www.djangobook.com/en/2.0/chapter05/,有一个包含Publisher,Author和Book的书籍模型。但似乎他们错过了提及如何为Book Model添加数据,其中包含与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())

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

有人能指出正确的方法吗?感谢

2 个答案:

答案 0 :(得分:3)

在python中,位置参数必须放在关键字args之前。传递参数时publication_date=datetime.datetime.now()

答案 1 :(得分: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())