【问题标题】:Django Models - One to Many or Many o ManyDjango 模型 - 一对多或多对多
【发布时间】:2023-04-06 05:02:01
【问题描述】:

在 Django 中没有一对多关系,只有多对一。如果在子表上定义外键很奇怪,我们应该去多对多吗?

例如:

这本书有很多页。如果我们在 Page 模型上定义外键,那么页面就有一本书,这不是一件直观的事情(或说)。

选项 1:

class Book(models.Model):
    name = models.CharField(max_length=100)
    date_published = models.DateTimeField(default=timezone.now)


class Page(models.Model):
   page_number = models.IntegerField()
   page_text = RichTextField()
   book = models.ForeignKey(Book, on_delete=models.CASCADE)

选项 2

class Book(models.Model):
    name = models.CharField(max_length=100)
    date_published = models.DateTimeField(default=timezone.now)
    pages = models.ManytoMany(Page)


class Page(models.Model):
   page_number = models.IntegerField()
   page_text = RichTextField()

在选项 2 中,我可以通过 book.pages 访问本书的页面。

在选项 1 中,我不知道如何访问这些页面,也许 book.pages_set.objects.all() 并不漂亮。

我问了一个程​​序员同事,他说只使用多对多。我了解每种方法的含义,并且我也了解两者之间在数据库中发生的情况的区别。我的问题是什么是更好/标准的方法。

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    我赞成第一个选项,因为许多书籍没有公共页面及其包含。 因此,使用第一个选项,您可以使用以下查询集访问书页

    pages = book.page_set.all()
    

    这里,你也可以在外键字段中使用related_name参数:

    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name="pages")
    

    然后可以使用获取书页

    pages = book.pages.all()
    

    【讨论】:

      【解决方案2】:

      我想使用第一个示例。由于书籍没有公共页面。为了将书连接到页面,您必须使用后向关系。在这种关系中,使用了 _set 方法。所有型号名称和归档名称都必须是小写字母,尽管它们是大写字母。

      m=book.page_set.all()
      

      现在您可以使用 m 来使用 Book 中 Page 的所有属性。 有关反向或反向关系的更多信息,请访问here

      【讨论】:

        【解决方案3】:

        在您看来,您传递了 Book 的 id,并在查询中使用它来过滤它们链接到的页面。

        例如:

        def show_pages(request, book_id):
            pages = Pages.objects.filter(book=book_id)
        

        【讨论】:

          猜你喜欢
          • 2019-09-15
          • 2020-05-04
          • 2017-05-15
          • 2011-01-03
          • 2016-07-17
          • 2012-03-24
          • 1970-01-01
          • 2014-05-16
          • 2011-12-20
          相关资源
          最近更新 更多