2012-05-31 41 views
6

Tôi có một thư mục mô hình có một vài mô hình trong các tệp đã có trong DB. Tôi vừa thêm một tập tin/mô hình khác nhưng nó không được thêm vào DB khi tôi chạy syncdb. Tôi đã thử manage.py validate và nó đang chạy tốt. Tôi cũng đã chạy mã và nó chỉ thất bại khi nó cố gắng để tiết kiệm với "bảng không tồn tại".Mô hình Django không hiển thị trong DB sau syncdb

cấu trúc ban đầu là như thế này:
/mô hình
- __ init __ py
- file1.py
- file2.py

__ init __ .py trông giống như:

from file1 import File1Model 
from file2 import File2Model 

tôi thêm file3.py
/mô hình
- __ init __ py
- file1.py
- file2.py
- file3.py

và sửa đổi __ init __ py

from file1 import File1Model 
from file2 import File2Model 
from file3 import File3Model 

Và nội dung của tệp3 (tên có thể đã được thay đổi để bảo vệ người vô tội, nhưng bên cạnh đó là tệp chính xác của nó):
CẬP NHẬT: vừa thử thêm khóa chính vì trường id có thể đã gây rối với việc thêm tự động id chính của số nguyên. Cũng đã thử một vài biến thể nhưng không có súc sắc.

from django.db import models 
from django.contrib.auth.models import User 


class File3Model(models.Model): 
    user = models.OneToOneField(User) 
    token = models.CharField(max_length=255, blank=False, null=False) 
    id = models.CharField(primary_key=True, max_length=255) 

    class Admin: 
     pass 

    class Meta: 
     app_label = 'coolabel' 

    def __unicode__(self): 
     return self.user.username 

    @staticmethod 
    def getinstance(user, token, id): 
     try: 
      instance = File3Model.objects.get(pk=id) 
      if instance.token != token: 
       instance.token = token 
       instance.save() 
      return instance 
     except: 
      pass 
     instance = File3Model() 
     instance.user = user 
     instance.token = token 
     instance.id = id 
     instance.save() 
     return instance 

Vì vậy, trong ví dụ này, File1Model và File2Model đã có trong DB và vẫn ở trong DB sau syncdb. Tuy nhiên, File3Model không được thêm ngay cả sau khi chạy lại syncdb. Có cách nào để tìm ra lý do tại sao mô hình mới không được thêm vào ??

+0

Bạn đã thử 'syncdb --all' chưa? – sultan

+0

vừa thử nhưng vẫn không hoạt động. – ntrrobng

Trả lời

0

BOOM!

Tôi đã sử dụng một app_label khác cho mô hình mới nhưng nó phải giống nhau trên mô hình nhóm.

Các nhãn mẫu khác là "mediocrelabel" và mẫu mới của tôi có nhãn "nhãn hiệu". Tôi đã thay đổi nhãn của mô hình mới thành "mediocrelabel" và bây giờ chúng được thêm vào DB một cách chính xác.

Cảm ơn sự giúp đỡ của bạn, mọi người!

9

Nếu bạn xác định mô hình bên ngoài models.py, bạn phải đặt thuộc tính app_label trên mô hình lớp Meta.

Chỉnh sửa: app_label phải đề cập đến một ứng dụng trong cài đặt INSTALLED_APPS của bạn. Nó có lẽ nên khớp với tên của ứng dụng mà thư mục mô hình đang ở, trừ khi bạn có một lý do thực sự tốt để làm khác. Điều đó dường như là vấn đề của bạn ở đây.

class File3Model(models.Model): 
    foo = models.CharField(...) 
    ... 

    class Meta: 
     app_label = "my_app" 

Lưu ý rằng syncdb sẽ không bao giờ xóa bất kỳ bảng nào khỏi db. Các bảng khác có thể được tạo bằng syncdb trước khi models.py được thay thế bằng cấu trúc thư mục.

+0

Trường app_label được đặt trong lớp Meta nhưng vẫn không được thêm vào DB. – ntrrobng

+0

'app_label' phải là một ứng dụng trong cài đặt' INSTALLED_APPS' của bạn. Tôi đã thêm điều này vào câu trả lời. – Alasdair

0

Tại sao bạn chia mô hình của mình và có thư mục mô hình thay vì đặt mô hình trong models.py?

Trong dự án của riêng tôi có khoảng 10 mẫu sống trong models.py và tôi ổn với nó.

Bạn cũng có thể thử manage.py syncdb --all.

Và tôi nghĩ tốt hơn nên giữ tất cả các mô hình trong một tệp và nhập chúng như from my_app.models import model_name thay vì lưu ý nhập mô hình cần thiết vào models/__init__.py. Bằng cách này bạn tránh được nhiều vấn đề và nhập khẩu hàng dài và không quan tâm đến nơi some_model sống trong số models/*.py tệp.

Cảm ơn,

Sultan

+0

Cảm ơn lời khuyên của bạn. Tuy nhiên, tôi đang làm việc với mã hiện có và tìm ra nó sẽ là ngớ ngẩn để di chuyển mọi thứ trở lại vào tệp models.py. Tôi rất muốn giữ mọi thứ trong thư mục mô hình. – ntrrobng

1

đặt app_label thành ứng dụng của tôi giải quyết được sự cố của tôi.

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