Solução de problemas “Erro: Não é possível serializar o banco de dados:” ao executar dumpdata

9

Por alguma razão, hoje eu não posso despejar meu banco de dados usando python manage.py dumpdata ou de um link que pode baixar o arquivo mysql.

Eu tentei usar python manage.py dumpdata --traceback e aqui está a informação que tenho.

Traceback (most recent call last):
  File "manage.py", line 11, in <module>
    execute_manager(settings)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 438, in execute_manager
    utility.execute()
  File "/usr/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 379, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 191, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/base.py", line 220, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/management/commands/dumpdata.py", line 114, in handle
    use_natural_keys=use_natural_keys)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize
    s.serialize(queryset, **options)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/base.py", line 48, in serialize
    self.handle_fk_field(obj, field)
  File "/usr/local/lib/python2.7/site-packages/django/core/serializers/python.py", line 48, in handle_fk_field
    related = getattr(obj, field.name)
  File "/usr/local/lib/python2.7/site-packages/django/db/models/fields/related.py", line 301, in __get__
    raise self.field.rel.to.DoesNotExist
django.contrib.auth.models.DoesNotExist

Diz django.contrib.auth.models.DoesNotExist . Eu me pergunto se tem algo a ver com uma chave estrangeira ou algo assim.

models.py

class Client(models.Model):
    name = models.CharField(max_length = 40)
    telephone = models.CharField(max_length = 20)
    website = models.URLField(verify_exists = False)
    fax = models.CharField(max_length = 20)
    email = models.EmailField()
    is_active = models.BooleanField()
    user  = models.ForeignKey(User)
    datetime = models.DateTimeField(default=datetime.now)
    note = models.TextField()
    def __unicode__(self):
        return self.name

De meus models.py, o usuário de campo, datetime e nota foram adicionados recentemente. Agora, se para um cliente, qualquer um desses campos não tiver um valor, ou seja, em branco, receberei o erro Unable to serialize database .

Quando eu pesquisei usuário, data e nota no mysql. A tabela para o cliente mostra user_id, datetime e note para ter valores nulos (que é o que eu quero). Por que não permite valores nulos?

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment | 
| name      | varchar(40)  | NO   |     | NULL    |                | 
| telephone | varchar(20)  | NO   |     | NULL    |                | 
| website   | varchar(200) | NO   |     | NULL    |                | 
| fax       | varchar(20)  | NO   |     | NULL    |                | 
| email     | varchar(75)  | NO   |     | NULL    |                | 
| is_active | tinyint(1)   | NO   |     | NULL    |                | 
| user_id   | int(11)      | YES  | MUL | NULL    |                | 
| datetime  | datetime     | YES  |     | NULL    |                | 
| note      | longtext     | YES  |     | NULL    |                | 
+-----------+--------------+------+-----+---------+----------------+
    
por Shehzad009 13.07.2011 в 16:11
fonte

1 resposta

5

Você precisa dizer ao Django que deve permitir valores NULL nos campos adicionados recentemente. Ele olha apenas para a definição de campos, ele não busca o esquema do banco de dados.

O erro self.field.rel.to.DoesNotExist é mais provável quando um cliente não tem um usuário associado e client.user é acessado. É porque, por padrão, todos os campos são obrigatórios. Se você alterar sua definição de modelo como mostrado abaixo, o erro deverá desaparecer.

class Client(models.Model):
    # ...
    user  = models.ForeignKey(User, 
                             null=True, blank=True) 
    datetime = models.DateTimeField(default=datetime.now,
                             null=True, blank=True)
    note = models.TextField(null=True, blank=True)
  • null=True permite valores NULL , respectivamente, None em um campo.
  • blank=True permite que você deixe o campo vazio em um formato de modelo (por exemplo, no admin).

( blank e null são ambos False por padrão)

    
por Jakub 03.08.2011 / 00:58
fonte