问题描述
我想基于 book-author-publish 做一个简单的 Django 项目
这里的书有一个作者,但作者有多本书。
第二,我想要书和出版物之间的关系,比如出版物有多本书但书只有一个出版物(如果出版了书)或书没有出版(如果书没有出版)我该如何为它制作模型?
这里面哪里要用到外键?
解决方法
你是一个多对一关系的ForeignKey
[Django-doc]。由于您的 Book
有一个作者,因此我们为 ForeignKey
模型指定了一个 Book
:
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=…
反向指定关系的名称(因此获取给定 Book
的所有 Author
),默认为 modelname_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')
然后您可以访问 author
的 Book
,例如 b1
为:
b1.author # will return a
我们可以通过以下方式获得a
写的书:
a.books.all() # a queryset containing b1 and b2
对于发布,您可以再次使用 ForeignKey
,但是 ForeignKey
可以是 NULL
,我们通过指定 null=True
[Django-doc] 参数来实现,并设置 { {3}},这样 ModelForm
和 ModelAdmin
不会将此视为必填字段:
class Book(models.Model):
title = models.CharField(max_length=128)
author = models.ForeignKey(
Author,related_name='books'
)
publication = models.ForeignKey(
Publication,related_name='books',null=True,blank=True
)