我的问题:
我希望我的客户能够将许多不同的产品连接到一个合同,并且列出附加到合同的所有产品的代码感觉很脏。
我的模特
class Contract(models.Model):
# The contract, a customer can have many contracts
customer = models.ForeignKey(Customer)
class Product(models.Model):
# A contract can have many different products
contract = models.ForeignKey(Contract)
start_fee = models.PositiveIntegerField()
# A customer may have ordered a Car, a Book and a HouseCleaning,
# 3 completly different Products
class Car(Product):
brand = models.CharField(max_length=32)
class Book(Product):
author = models.ForeignKey(Author)
class HouseCleaning(Product):
address = models.TextField()
要列出连接到合同的所有产品,代码如下所示:
c = Contract.objects.get(pk=1)
for product in c.product_set.all():
print product.book # Will raise an Exception if this product isnt a Book
我找不到任何理智的方法来找出产品是什么类型的产品!
我目前的解决方案
我已经像这样解决了......但是整个混乱感觉......错了。我会很高兴能找到正确的方向。
class Product(models.Model):
# (as above + this method)
def getit(self):
current_module = sys.modules[__name__]
classes = [ obj for name, obj in inspect.getmembers(current_module)
if inspect.isclass(obj) and Product in obj.__bases__ ]
for prodclass in classes:
classname = prodclass.__name__.lower()
if hasattr(self, classname):
return getattr(self, classname)
raise Exception("No subproduct attached to Product")
所以我可以像这样获取每个特定产品(伪代码):
c = Contract.objects.get(pk=1)
for product in c.product_set.all():
print product.getit()
列出所有“真实”产品,而不仅仅是基础产品实例。
我需要帮助
以某种理智的方式做到这一点
我不介意为了获得更清晰的代码而不得不抽象出一堆步骤。
答案 0 :(得分:1)
这个其他堆栈问题看起来直接相关 - 也许会有所帮助?
>>> Product.objects.all()
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...]
Subclassed django models with integrated querysets
具体而言,该代码段包含子模型Meal
Salad(Meal)
答案 1 :(得分:0)
如果您知道客户永远不会订购Product
,为什么不将其作为抽象模型,然后自己进行排序?此时访问用户的书籍,汽车或房屋清洁变得很容易,因为您可以使用c.book_set.all()
,c.car_set.all()
等。
如果你想要一个合同附加的所有Product
的列表,你必须自己进行排序 - 但是编写一个sorted
包装器来放入所有内容并不困难如果您正在寻找的话,请列出一份清单。