Como Django campos modelo funciona?

votos
10

Primeiro de tudo, eu não estou em programação web. Topei com Django e ler um pouco sobre os modelos. Fiquei intrigado com o código seguinte (de djangoproject.com):


class Person(models.Model):
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)

    def __str__(self):
        # Note use of django.utils.encoding.smart_str() here because
        # first_name and last_name will be unicode strings.
        return smart_str('%s %s' % (self.first_name, self.last_name))

Por minha compreensão de python, first_name e last_name são variáveis ​​de classe, certo? Como isso é usado no código (porque eu acho que a criação Person.first_name ou Person.last_name afetará todas as instâncias pessoa)? Por que é usado dessa maneira?

Publicado 01/02/2009 em 12:43
fonte usuário
Em outras línguas...                            


3 respostas

votos
19

A essência da sua pergunta é "como é que estas variáveis de classe (que eu atribuir objetos de campo para) de repente se tornam variáveis de instância (que eu atribuir dados a) em ORM do Django"? A resposta para isso é a magia do Python metaclasses .

A metaclasse permite ligar para e modificar o processo de criação de uma classe Python (não a criação de uma instância dessa classe, a criação da própria classe).

Objeto do Django Model (e, portanto, também os seus modelos, que são subclasses) tem uma metaclass ModelBase . Parece através de todos os atributos de classe de seu modelo, e qualquer que são instâncias de uma subclasse campo ele se move em uma lista de campos. Essa lista é atribuído como um atributo do _metaobjeto, que é um atributo de classe do modelo. Assim, você pode sempre chegar os objetos campo real via MyModel._meta.fields, ou MyModel._meta.get_field('field_name').

O Model.__init__método então é capaz de usar a _meta.fieldslista para determinar qual instância atributos deve ser inicializado quando uma instância de modelo é criado.

Não tenha medo de mergulhar no código fonte do Django; que é uma grande fonte de educação!

Respondeu 01/02/2009 em 19:56
fonte usuário

votos
4

Sim, first_name e last_name são variáveis ​​de classe. Eles definir campos que serão criados em uma tabela de banco de dados. Há uma mesa Pessoa que tem first_name e last_name colunas, por isso faz sentido para eles para estar no nível de classe neste momento.

Para mais informações sobre modelos, consulte: http://docs.djangoproject.com/en/dev/topics/db/models/

Quando se trata de aceder a instâncias de uma pessoa em código, você está normalmente fazendo isso através de ORM do Django, e neste momento eles essencialmente se comportam como variáveis ​​de instância.

Para mais informações sobre instâncias de modelo, consulte: http://docs.djangoproject.com/en/dev/ref/models/instances/?from=olddocs

Respondeu 01/02/2009 em 12:57
fonte usuário

votos
0

Não é uma resposta real, mas para o enriquecimento:

Person.first_name 

não vai funcionar

p = Person.objects.get(pk=x)
p.first_name

vai funcionar. assim uma instância de objeto de pessoa tem um primeiro e último nome, mas estática contexto pessoa não.

Além disso, note: Django tem Managers modelo que são permitir "Pessoa" para fazer operações queryset estáticos. (Https://docs.djangoproject.com/en/dev/topics/db/managers/#managers).

assim, por exemplo

peoples = Person.objects.all()
Respondeu 08/03/2012 em 15:45
fonte usuário

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