微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Django 中创建多对一字段?

如何解决如何在 Django 中创建多对一字段?

我想基于 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')

然后您可以访问 authorBook,例如 b1 为:

b1.author  # will return a

我们可以通过以下方式获得a写的书:

a.books.all()  # a queryset containing b1 and b2

对于发布,您可以再次使用 ForeignKey,但是 ForeignKey 可以是 NULL,我们通过指定 null=True [Django-doc] 参数来实现,并设置 { {3}},这样 ModelFormModelAdmin 不会将此视为必填字段:

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
    )

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。