2010-12-16 93 views
0

我的問題
我希望我的客戶能夠將多個不同的產品連接到一個合同,並且列出所有附加到合同的產品的代碼感覺很髒。是否可以將不同的產品對象連接到一個合同?

我的模型

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幫助做這在某種理智的方式是什麼。
我不介意把所有的東西都抽象出來,只是爲了得到更乾淨的代碼。

回答

1

這個其他堆棧的問題看起來直接相關 - 也許它會幫助嗎?

>>> Product.objects.all() 
[<SimpleProduct: ...>, <OtherProduct: ...>, <BlueProduct: ...>, ...] 

Subclassed django models with integrated querysets

具體來說,段已子類車型MealSalad(Meal)

http://djangosnippets.org/snippets/1034/

祝你好運!

+0

這看起來是正確的,我現在會深入研究它,謝謝! – schmilblick 2010-12-19 09:15:22

+0

這完全正確! :) 謝謝!!今天我又瞭解了內容類型框架,非常感謝! – schmilblick 2010-12-20 17:30:37

+0

嘿,恭喜!我對解決方案非常好奇 - 你是否逐字逐句使用了片段?小心分享? :d – 2010-12-20 19:44:41

0

如果您知道客戶永遠不會訂購Product,爲什麼不把它作爲抽象模型,然後就自己排序呢?在這一點上訪問用戶的書籍,汽車或房屋清潔變得容易,因爲您只需使用c.book_set.all(),c.car_set.all()等等。

你不得不做整理自己,如果你想,說,附屬於合同的所有Product s的名單 - 但它並不難寫一個sorted包裝把一切都變成清單你,如果這就是您正在尋找。

+0

合同將包含書本,汽車和房屋清潔物品,這些物品彼此不同? – 2010-12-16 18:08:44

+0

Easy:'def product_set(self):products = self.book_set.all()+ self.car_set.all()+ self.housecleaning_set.all()return sorted(products,lambda i:i.created_date)' – girasquid 2010-12-16 18:11:11

+0

So每次添加新產品時,我都需要添加另一個c.newproduct_set.all()?我對這個解決方案感到不舒服...我是否太挑剔?:) – schmilblick 2010-12-17 10:05:23

相關問題