【问题标题】:How to determine the specific object using another class object as a ManyToMany in a django model?如何在 django 模型中使用另一个类对象作为 ManyToMany 来确定特定对象?
【发布时间】:2019-03-15 14:12:29
【问题描述】:

如何使用另一个对象来确定对象,如下所示?

for author in book.authors.all():
    author.some_func(book)

考虑到我们如何使用它,输入这本书作为参数是多余的。有没有办法从本质上确定这本书?类似于我们如何使用“自我”?在下面的 some_func() 方法的伪代码中,什么代码将用于“如果从 Book 对象调用为字段”和“use_this_book = 调用 Book 对象”

class Book(models.Model):
    authors = ManyToMany(Author, settings)

class Author(models.Model):

    fields = relationships

    def some_func(self, book):
        author = self
        if called as field from Book object:  #  replace this line
            use_this_book = calling Book object  # and this line
        else:
            use_this_book = book
        return do_something_func(author, use_this_book)

【问题讨论】:

  • 这个问题不是很清楚。为什么你认为通过书是多余的?一个方法不能知道它是在一个对象上调用的,而该对象是另一个对象的属性;即使这是可能的,它也不会是 Pythonic,明确性是一种美德。

标签: django django-models relationship


【解决方案1】:

如果你有一个ManyToManyField 定义了作者和书之间的关系,你必须将书传递给author.some_func。这是因为一个作者可能有多本书,您需要选择特定的书来执行操作。

如果您将关系更改为:

class Book(models.Model):
    author = ForeignKey(Author, settings)

您仍然有同样的问题,因为作者仍​​然可以写多本书。如果您将方法移至Book,您将能够做您想做的事情:

book.some_func()

class Book:
    def some_func(self):
        author = self.author
        # Other stuff

取决于some_func 的作用,这可能对您有用,也可能对您无效。但是,我建议您保持 Book 和 Author 之间的 M2M 关系,因为这更灵活并且与现实世界的运作方式相匹配。即使它适用于您当前的案例,最终您也会遇到需要多个作者写一本书的情况。

【讨论】:

  • 作者/书籍 senario 仅用于示例,它似乎是我在一些教程/示例中找到的常见问题。使用 ForienKey 时,它将处于真正的多对一场景中,因此每本“书”只有一个“作者”。
  • 关于 ForeignKey 示例并将函数移动到另一个类是正确的。我在最后一刻将这部分添加到问题中,出于某种原因,我认为它会澄清我在做什么。它只是复杂的事情,我会删除它。
  • 我不知道你在找什么。
猜你喜欢
  • 2015-02-13
  • 2018-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-10
  • 1970-01-01
相关资源
最近更新 更多