我的問題:
我希望我的客戶能夠將多個不同的產品連接到一個合同,並且列出所有附加到合同的產品的代碼感覺很髒。是否可以將不同的產品對象連接到一個合同?
我的模型
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()
列出所有的「真實」的產品,而不僅僅是baseproduct實例。
我需要
Sugggestions幫助做這在某種理智的方式是什麼。
我不介意把所有的東西都抽象出來,只是爲了得到更乾淨的代碼。
這看起來是正確的,我現在會深入研究它,謝謝! – schmilblick 2010-12-19 09:15:22
這完全正確! :) 謝謝!!今天我又瞭解了內容類型框架,非常感謝! – schmilblick 2010-12-20 17:30:37
嘿,恭喜!我對解決方案非常好奇 - 你是否逐字逐句使用了片段?小心分享? :d – 2010-12-20 19:44:41