Como posso implementar uma interface comum para conjuntos de objetos relacionados Django?

votos
4

Aqui está o acordo:

Eu tenho dois modelos db, digamos que ShoppingCarte Order. Seguindo o princípio DRY eu gostaria de extrair alguns adereços / métodos comuns em uma interface compartilhada ItemContainer.

Tudo correu bem até me deparei com o _flush()método que realiza principalmente a eliminar em um conjunto de objetos relacionados.

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

# ...

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

Então a questão é: como eu sei dinamicamente wheter é orderitem_setou shoppingcartitem_set?

Publicado 05/02/2009 em 10:24
fonte usuário
Em outras línguas...                            


2 respostas

votos
3

Primeiro, aqui estão dois snippets que deve ser exatamente o que você está procurando:

Em segundo lugar, você pode querer repensar seu projeto e mude para o django.contrib quadro tipos de conteúdo que tem um simples .model_class()método. (O primeiro trecho postado acima também usa a estrutura do tipo de conteúdo).

Terceiro, você provavelmente não quer usar herança múltipla em sua classe de modelo. Não deve ser necessário e eu não ficaria surpreso se houvesse algum lado obscuro afeta. Basta ter interface.ItemContainerherdar models.Modele depois Orderherdar única interface.ItemContainer.

Respondeu 05/02/2009 em 11:26
fonte usuário

votos
2

Você pode definir o argumento related_name de um ForeignKey, por isso, se você quiser fazer mudanças mínimas para seu projeto, você poderia apenas ter ShoppingCartItem e OrderItem definir o mesmo related_name em seus ForeignKeys para ShoppingCart e Ordem, respectivamente (algo como "item_set"):

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

e

cart = models.ForeignKey(ShoppingCart, related_name='item_set')
Respondeu 05/02/2009 em 18:31
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more