【问题标题】:Django How to use ManyRelatedManagerDjango 如何使用 ManyRelatedManager
【发布时间】:2011-05-25 08:49:22
【问题描述】:

我有 2 个不同的应用程序,并且没有特别的理由相互交流。 这意味着我不想在任何一个应用程序中导入任何一个名称。所有的工作都应该是 在胶水应用中。

我想编写一个胶水应用程序,它可以通过 ManyToManyField 连接到特定模型,例如:

在应用客户中,

class Customer(models.Model):
    ...

在应用比萨饼中,

class Pizza(models.Model):
    ...

然后我想写一个卖披萨的应用程序,如下所示:

class PizzaSold(models.Model):
    customer = models.ForeignKey(related_name='pizzas')
    pizza = models.ForeignKey(related_name='customers')

    objects = ManyRelatedManager()

这样我就可以直接从顾客那里获得比萨饼

 pizza = Pizza.objects.all()[0]
 for customer in pizza.customers:
     #Do something cool

以及这款新应用中的披萨顾客。

我该怎么做?

【问题讨论】:

  • 您使用的是哪个版本的 Django?您从哪里找到这个 ManyRelatedManager?你是从哪里导入的?

标签: python django many-to-many manyrelatedmanager


【解决方案1】:

如果您使用 ManyToManyField 对在 Customer 模型中销售的比萨进行建模会怎样?

class Customer(models.Model):
   pizzas_bought = models.ManyToManyField(Pizza)

此外,如果您希望向您的客户添加额外数据 -> 披萨关系,请使用 through parameter 指定映射类:

class Customer(models.Model):
   pizzas_bought = models.ManyToManyField(Pizza, through=PizzaSold)

class PizzaSold(models.Model):
   customer = models.ForeignKey(Customer)
   pizza = models.ForeignKey(Pizza)

同样,使用related_name 也可以很好地使用ManyToManyFields。例如:

class Customer(models.Model):
   pizzas_bought = models.ManyToManyField(related_name='pizzas')

【讨论】:

  • +1 用于指向带有“through”参数的 ManyToManyfield。这似乎是标准方法。
  • 好的,我可能没有具体说明,我不想/不能在客户应用程序中使用披萨这个名称,这就是我不想/不能使用这种标准方法的原因。我可能不得不求助于它......
  • 您的意思是您不能使用“Pizza”类?那你为什么不能用 related_name='pizzas' 呢?
  • Hm related_name 有点工作,但它仍然不如自动加入表格的 ManyToManyField 方便。我当然可以手动完成。
  • 我明白了。我不得不问一个显而易见的问题:如果披萨和客户模型如此紧密耦合,为什么还要将它们保存在单独的应用程序中?
猜你喜欢
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2015-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多