Как реализовать общий интерфейс для наборов объектов, связанных с Django? - PullRequest
4 голосов
/ 05 февраля 2009

Вот сделка:

У меня есть две модели дБ, скажем, ShoppingCart и Order. Следуя принципу СУХОГО, я хотел бы извлечь некоторые общие реквизиты / методы в общий интерфейс ItemContainer.

Все шло хорошо, пока я не наткнулся на метод _flush(), который в основном выполняет удаление связанного набора объектов.

class Order(models.Model, interface.ItemContainer):

# ...

def _flush(self):
    # ...
    self.orderitem_set.all().delete()   

Итак, вопрос в том, как мне узнать, динамически ли это orderitem_set или shoppingcartitem_set?

Ответы [ 2 ]

3 голосов
/ 05 февраля 2009

Во-первых, вот два фрагмента Django, которые должны быть именно тем, что вы ищете:

Во-вторых, вы можете переосмыслить свой дизайн и перейти на django.contrib framework типов контента , который имеет простой метод .model_class(). (Первый фрагмент, размещенный выше, также использует структуру типов контента).

В-третьих, вы , вероятно, не хотите использовать множественное наследование в своем классе модели. Это не нужно, и я не удивлюсь, если будут какие-то неясные побочные эффекты. Просто имейте interface.ItemContainer наследование от models.Model и затем Order наследование только от interface.ItemContainer.

2 голосов
/ 05 февраля 2009

Вы можете установить аргумент related_name для ForeignKey, поэтому, если вы хотите внести минимальные изменения в свой дизайн, вы можете просто сделать так, чтобы ShoppingCartItem и OrderItem установили одинаковое значение related_name для своих ForeignKeys на ShoppingCart и Order соответственно (что-то вроде "item_set «):

order = models.ForeignKey(Order, related_name='item_set')

и

cart = models.ForeignKey(ShoppingCart, related_name='item_set')
...