Pergunta

Eu criei duas novas classes que herdam a entrada do modelo:

class Entry(models.Model):
    LANGUAGE_CHOICES = settings.LANGUAGES

    language = models.CharField(max_length=2, verbose_name=_('Comment language'), choices=LANGUAGE_CHOICES)
    user = models.ForeignKey(User)
    country = models.ForeignKey(Country, null=True, blank=True)

    created = models.DateTimeField(auto_now=True)

class Comment(Entry):
    comment = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))

class Discount(Entry):
    discount = models.CharField(max_length=2000, blank=True, verbose_name=_('Comment in English'))
    coupon = models.CharField(max_length=2000, blank=True, verbose_name=_('Coupon code if needed'))

Depois de adicionar esses novos modelos ao admin via admin.site.register, estou obtendo o ValueError ao tentar criar um comentário ou um desconto via Admin. Adicionar entradas funciona bem.

Erro msg:

ValueError em/admin/revisões/desconto/add/não pode atribuir "''": "desconto.discount" deve ser uma instância de "desconto". Método de solicitação: Obtenha URL de solicitação: http://127.0.0.1:8000/admin/reviews/discount/add/Tipo de exceção: ValueError Exception Valor:
Não é possível atribuir "''": "desconto.discount" deve ser uma instância de "desconto". Local de exceção: /library/python/2.6/site-packages/django/db/models/fields/related.py em definir, Linha 211 Python Executável:/usr/bin/python python versão: 2.6.1

Foi útil?

Solução

O motivo desse erro apareceu foi porque eu usei o mesmo nome da coluna que já foi usado com o nome do modelo. Karen T. contribuiu com a seguinte resposta em Lista de discussão do Django:

O problema parece ser que você nomeou um campo em seu modelo de comentário com o mesmo nome, apenas minúscula. O comentário herda da entrada, usando a inferência de múltiplas mesas. Isso adiciona um OnetoOnefield no comentário à entrada, que tem um efeito colateral de adicionar um atributo 'comentário' à entrada. Este é o atributo que permite acessar o comentário associado à entrada como resultado do OnetoOnefield em comentário e, por padrão, recebe o nome do modelo relacionado, All-Lowercase.

O problema ocorre então quando o modelo de comentário "herda" todos os campos/atributos de entrada: o atributo 'Comentário' herdado da entrada está aparentemente superando o campo de comentários especificado. Isso provavelmente é um bug, mas parece estar lá desde então, pois 1.0. Não fiz nenhuma pesquisa para ver se foi relatada.

Como solução alternativa, você pode nomear seus campos algo diferente do nome do modelo, todos com base inferior, ou pode especificar explicitamente o OneToOnefield nos modelos infantis, especificando parent_link = true e algo diferente do nome do modelo, todos com base em Related_name.

Outras dicas

Hunch diz que você pode fazer com a declaração de sua classe de entrada como abstrata, a menos que você precise de uma entrada como objeto real também

...rest of Entry model here...
created = models.DateTimeField(auto_now_add=True) ## ONLY set date when created, not every save

class Meta:
   abstract = True

...methods for your model etc...
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top