【问题标题】:How to make many to one field in Django?如何在 Django 中创建多对一字段?
【发布时间】:2021-05-04 08:40:28
【问题描述】:

我想做一个基于书籍-作者-出版的简单Django项目

这本书有一个作者,但作者有多本书。

其次,我想要书籍和出版物之间的关系,例如出版物有多本书但书籍有一个出版物(如果书籍已出版)或书籍没有出版物(如果书籍未出版)我该如何为它制作模型?

在哪里使用外键?

【问题讨论】:

  • 现在我可以理解书作者关系了。基于条件的书刊关系解决办法是什么???
  • 我不知何故忽略了这一点,在这种情况下你可以创建一个NULLable ForeignKey

标签: django django-models foreign-keys


【解决方案1】:

您是一个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')

然后您可以访问Bookauthor,例如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
    )

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 2020-06-01
    • 2018-12-19
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多