Django - desenhar modelos com campos virtuais?

votos
2

Eu gostaria de perguntar sobre a abordagem mais elegante quando se trata de conceber modelos com campos virtuais como abaixo no Django ...

Vamos dizer que nós estamos construindo uma loja online e todos os produtos do sistema são definidos pelo modelo de produtos .

class Product(models.Model):
    # common fields that all products share
    name = ...
    brand = ...
    price = ...    

Mas a loja terá muitos tipos de produtos completamente alheios uns com os outros, então eu preciso de alguma forma para armazenar esses campos virtuais de diferentes tipos de produtos (isto é. De capacidade de um leitor de MP3, PageCount de um livro, ..).

As soluções que eu poderia vir acima com minhas habilidades Django matérias estão longe de ser perfeito até agora:

  • Ter um custom_fields propriedade e tabelas intermediárias que eu gerenciar manualmente. (Gritando feio na minha cara :))

  • Ou herança de classes de Produtos na mosca com as declarações exec-eval perigosas do Python (que é muita magia vudu para manutenção e também a implementação exigiria conhecimento de internos do Django).

Qual é a sua opinião sobre isso?

TIA.

Publicado 26/02/2009 em 16:08
fonte usuário
Em outras línguas...                            


4 respostas

votos
13

Os produtos têm características.

class Feature( models.Model ):
    feature_name = models.CharField( max_length=128 )
    feature_value = models.TextField()
    part_of = models.ForeignKey( Product )

Curtiu isso.

Apenas uma lista de recursos.

p= Product( "iPhone", "Apple", 350 )
p.save()
f= Feature( "mp3 capacity", "16Gb", p )
f.save()

Se você quiser, você pode ter uma lista mestra de nomes de recursos em uma tabela separada. Não excesso de analisar características. Você não pode fazer qualquer processamento sobre eles. Tudo que você faz é apresentá-los.

Respondeu 26/02/2009 em 16:17
fonte usuário

votos
3

Ruby on Rails tem um campo "serializado", que permite que você para embalar um dicionário em um campo de texto. Talvez Django oferece algo semelhante?

Este artigo tem uma implementação de um SerializedDataField.

Respondeu 26/02/2009 em 16:09
fonte usuário

votos
2

Pessoalmente, eu iria com a resposta de S. Lott. No entanto, você pode querer criar um personalizado JSON Campo:

http://svn.navi.cx/misc/trunk/djblets/djblets/util/fields.py

http://www.djangosnippets.org/snippets/377/

Respondeu 26/02/2009 em 16:28
fonte usuário

votos
0

Vá com a herança. Criar subclasses produzir com suas próprias, campos adicionais.

Respondeu 27/02/2009 em 21:43
fonte usuário

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