您是一个ForeignKey [Django-doc],用于多对一关系。由于您的Book 有一个作者,因此我们为Book 模型指定ForeignKey:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=128)
# some other fields
# …
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(
Author,
on_delete=models.CASCADE,
related_name='books'
)
related_name=… 指定反向关系的名称(因此获取给定Author 的所有Books),默认为<i>modelname</i>_set,因此此处为book_set,但是例如,我们可以在此处将其更改为 books。
然后您可以创建一个Author 对象,例如:
a = Author.objects.create(name='J R R Tolkien')
b1 = Book.objects.create(author=a, title='The Hobbit')
b2 = Book.objects.create(author=a, title='Lord of the Rings')
然后您可以访问Book 的author,例如b1 为:
b1<b>.author</b> # will return a
我们可以通过以下方式获得a写的书:
a<b>.books</b>.all() # a queryset containing b1 and b2
对于发布,您可以再次使用ForeignKey,但ForeignKey 可以是NULL,我们通过指定null=True [Django-doc] 参数来做到这一点,并设置blank=True [Django-doc],这样ModelForm s 和 ModelAdmins 不会将此视为必填字段:
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(
Author,
on_delete=models.CASCADE,
related_name='books'
)
publication = models.ForeignKey(
Publication,
on_delete=models.CASCADE,
related_name='books',
null=True,
blank=True
)