如何获取 Django 中模型具有反向关系的所有类的集合?
给定:
from django.db import models
class Food(models.Model):
"""Food, by name."""
name = models.CharField(max_length=25)
class Cat(models.Model):
"""A cat eats one type of food"""
food = models.ForeignKey(Food)
class Cow(models.Model):
"""A cow eats one type of food"""
food = models.ForeignKey(Food)
class Human(models.Model):
"""A human may eat lots of types of food"""
food = models.ManyToManyField(Food)
仅给定 Food 类,如何获得与其具有“反向关系”的所有类的集合。 即给定类 Food,如何获得类 Cat、Cow 和 Human。
我认为这是可能的,因为 Food 具有三个“反向关系”:Food.cat_set、Food.cow_set 和 Food. human_set。
感谢帮助& 谢谢你!
Given:
from django.db import models
class Food(models.Model):
"""Food, by name."""
name = models.CharField(max_length=25)
class Cat(models.Model):
"""A cat eats one type of food"""
food = models.ForeignKey(Food)
class Cow(models.Model):
"""A cow eats one type of food"""
food = models.ForeignKey(Food)
class Human(models.Model):
"""A human may eat lots of types of food"""
food = models.ManyToManyField(Food)
How can one, given only the class Food, get a set of all classes that it has "reverse relationships" to. I.e. given the class Food, how can one get the classes Cat, Cow and Human.
I would think it's possible because Food has the three "reverse relations": Food.cat_set, Food.cow_set, and Food.human_set.
Help's appreciated & thank you!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
对源代码的一些挖掘揭示了:
django/db/models/options.py:
并且,在上面的模型上使用这些函数,你假设得到:
注意:我听说 Model._meta 是“不稳定的” ',也许在 Django-1.0 后的世界中不应该依赖它。
谢谢阅读。 :)
Some digging in the source code revealed:
django/db/models/options.py:
And, using these functions on the models from above, you hypothetically get:
Note: I hear Model._meta is 'unstable', and perhaps ought not to be relied upon in the post Django-1.0 world.
Thanks for reading. :)
A
)使用多表继承并创建一个“Eater”基类,由 Cat、Cow 和 Human 继承。
B) 使用 通用关系,其中 Food 可以是链接到任何其他模型。
这些都是有据可查且官方支持的功能,您最好坚持使用它们以保持自己的代码整洁,避免变通办法并确保将来仍受支持。
- 编辑(又名“如何成为名誉妓女”)
所以,这是针对该特定情况的秘诀。
假设您绝对想要猫、牛和人的单独模型。 在现实世界的应用程序中,您想问自己为什么“类别”字段不能完成这项工作。
通过泛型关系更容易到达“真实”类,因此这里是 B 的实现。我们不能在 Person、Cat 或 Cow 中拥有“food”字段,否则我们会遇到同样的问题。 因此,我们将创建一个中介“FoodConsumer”模型。 如果我们不想在一个实例中使用不止一种食物,我们就必须编写额外的验证测试。
现在,为了演示它,让我们编写这个工作 doctest :
Either
A) Use multiple table inheritance and create a "Eater" base class, that Cat, Cow and Human inherit from.
B) Use a Generic Relation, where Food could be linked to any other Model.
Those are well-documented and officially supported features, you'd better stick to them to keep your own code clean, avoid workarounds and be sure it'll be still supported in the future.
-- EDIT ( A.k.a. "how to be a reputation whore" )
So, here is a recipe for that particular case.
Let's assume you absolutely want separate models for Cat, Cow and Human. In a real-world application, you want to ask to yourself why a "category" field wouldn't do the job.
It's easier to get to the "real" class through generic relations, so here is the implementation for B. We can't have that 'food' field in Person, Cat or Cow, or we'll run into the same problems. So we'll create an intermediary "FoodConsumer" model. We'll have to write additional validation tests if we don't want more than one food for an instance.
Now, to demonstrate it let's just write this working doctest: