2010-11-16 29 views
7

Tôi đang cố gắng tạo mô hình cho một DB đang tồn tại. Sử dụng đầu ra của manage.py inspectdb, file models.py của tôi trông như thế này:lỗi "không xác định cột X.id" trong django sử dụng DB hiện tại

from django.db import models 

...some more stuff here... 

class Scripts(models.Model): 
    run_site = models.ForeignKey(Sites, db_column='run_site') 
    script_name = models.CharField(max_length=120) 
    module_name = models.CharField(unique=True, max_length=120) 
    type = models.CharField(max_length=24) 
    cat_name = models.CharField(max_length=90) 
    owner = models.ForeignKey(QAPeople, db_column='owner') 
    only_server = models.CharField(max_length=120, blank=True) 
    guest = models.IntegerField() 
    registered = models.IntegerField() 
    super = models.IntegerField() 
    admin = models.IntegerField() 
    run_timing = models.CharField(max_length=27) 
    manual_owner = models.ForeignKey(QAPeople, db_column='manual_owner') 
    script_id = models.IntegerField(unique=True,) 
    version = models.IntegerField() 
    comment = models.ForeignKey('ScriptComments', null=True, blank=True) 
    class Meta: 
     db_table = u'scripts' 

Khi tôi cố gắng làm Scripts.objects.all() tôi nhận được

Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 68, in __repr__ 
    data = list(self[:REPR_OUTPUT_SIZE + 1]) 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 83, in __len__ 
    self._result_cache.extend(list(self._iter)) 
    File "C:\Python26\lib\site-packages\django\db\models\query.py", line 269, in iterator 
    for row in compiler.results_iter(): 
    File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 672, in results_iter 
    for rows in self.execute_sql(MULTI): 
    File "C:\Python26\lib\site-packages\django\db\models\sql\compiler.py", line 727, in execute_sql 
    cursor.execute(sql, params) 
    File "C:\Python26\lib\site-packages\django\db\backends\util.py", line 15, in execute 
    return self.cursor.execute(sql, params) 
    File "C:\Python26\lib\site-packages\django\db\backends\mysql\base.py", line 86, in execute 
    return self.cursor.execute(query, args) 
    File "C:\Python26\lib\site-packages\MySQLdb\cursors.py", line 173, in execute 
    self.errorhandler(self, exc, value) 
    File "C:\Python26\lib\site-packages\MySQLdb\connections.py", line 36, in defaulterrorhandler 
    raise errorclass, errorvalue 
OperationalError: (1054, "Unknown column 'scripts.id' in 'field list'") 

Tại sao django nghĩ nên có một cột scripts.id? Làm thế nào để sửa chữa nó mà không cần thả các bảng v.v ...?

Trả lời

12

Luôn có theo mặc định là implicit id field as auto incrementing primary key trên mọi kiểu máy. Xem primary_key in the Django docs cách thay đổi trường đó thành một tên khác, nhưng cần phải có một khóa chính (cũng trong bảng của bạn).

Ngoài ra, bạn có thể không muốn gọi một trong các trường của mình super, vì nó đang ẩn bóng được xây dựng trong super của Python trong nội dung lớp học. Có thể cho bạn một thời gian khó khăn trong việc tìm kiếm lỗi trong một ngày nào đó.

+1

Đây là lý do tại sao thói quen tốt là sử dụng 'model.pk' để tham chiếu đến khóa chính thay vì' model.id'. –

0

Tôi không chắc chắn nếu you'r quen thuộc với django-south?

Đó là một công cụ nhỏ xinh xắn giúp bạn di chuyển dữ liệu của bạn từ một cấu trúc khác và cũng giúp xác định các vấn đề trước khi cam kết thông tin để bàn, khiến ít lỗi và gỡ lỗi sau đó.

+0

Liên kết này bị hỏng. Đây là cái mới: http://south.readthedocs.io/en/latest/ –

Các vấn đề liên quan