2011-07-14 28 views
6

Vì vậy, gần đây tôi đã cố tải một số đồ đạc do một người bạn thiết lập vào cơ sở dữ liệu của tôi. Khi tôi chạy máy chủ và tải lên các trang khác nhau mặc dù tôi nhận được lỗi:Truy vấn đối sánh ContentType không tồn tại

Caught DoesNotExist while rendering: ContentType matching query does not exist. 

Tôi đã thử chạy syncdb, và thậm chí thiết lập lại từng ứng dụng riêng lẻ, nhưng đã không có bất kỳ may mắn. Bất kỳ ý tưởng về cách làm cho lỗi này biến mất?

Trả lời

11

Nếu bạn nhìn vào bên trong lịch thi đấu, mỗi trận đấu có ba trường gốc: PK, fields (là bộ trường cho mục nhập PK 'trong bảng đó) và model, chứa tên ứng dụng. modelname, từ đó ORM bắt nguồn từ thông tin bảng.

Đó là appname.modelname mà Django tra cứu, thông qua công cụ ContentType, để tìm ra bảng nào để đưa dữ liệu của bạn vào.

Bạn của bạn đã cấp cho bạn ít nhất một lịch thi đấu trong đó nội dung của trường model không khớp với bất kỳ mô hình thực tế nào trong cơ sở dữ liệu của bạn. Đây có thể là lỗi chính tả, hiểu lầm, thay đổi mô hình hoặc tên ứng dụng hoặc bất kỳ số lỗi nào. Nhưng vật cố định không tương ứng với bất kỳ mô hình nào trong dự án của bạn, và nhà nhập khẩu vật cố cho bạn biết, bằng cách nói nó không thể khớp với tên được chỉ định của mô hình với bất kỳ tên nào trong bảng ContentType của dự án.

Việc sửa chữa có thể đơn giản như tìm ra những gì bảng được cho là có một ContentType, sau đó mở các vật cố định và thực hiện tìm kiếm và thay thế hàng loạt trên đường dây model:.

EDIT:

Đây là bản chỉnh sửa quá hạn dài (dài!). Nếu bạn sắp đến dumpdata chứa dữ liệu chung hoặc tham chiếu đến bảng chung ở nơi khác, bạn phải (Tôi thực sự không thể nhấn mạnh số tiền bạn phải) tìm hiểu cờ dumpdata --natural. Thay vì lưu thông tin contentType theo số, nó sẽ lưu nó theo tên, làm cho việc tải lại cơ sở dữ liệu đến nay, dễ dàng hơn và ít bị lỗi hơn.

+2

Kể từ Django 1.7, cờ '- tự nhiên' đã không được chấp nhận. Thay vào đó, bạn có thể sử dụng '--natural-foreign' – DMunoz

1

Bạn có thể kiểm tra bằng tay mỗi bảng ContentType trong db của bạn hoặc:

  • Nếu bảng của bạn là trống rỗng, xóa các bảng của mô hình của bạn trong et db của bạn lại chạy syncdb (chỉ khi trong bạn phát triển)

Hoặc bạn có thể sử dụng một trong những công cụ chuyển đổi Django:

0

Tôi tìm thấy một nguyên nhân khác nhau cho lỗi này, tôi muốn thêm trong trường hợp này sẽ giúp bất cứ ai khác. Điều gì gây ra vấn đề này cho tôi là tôi đã tạo một nhóm với các quyền cụ thể và sau đó gỡ cài đặt một ứng dụng được tham chiếu trong nhóm.

Cụ thể, tôi đã cài đặt đảo ngược tại một thời điểm và tạo nhóm được gọi là "Trình chỉnh sửa trang web" cho phép người dùng tạo, chỉnh sửa và xóa các bản sửa đổi.Sau đó tôi bỏ cài đặt phiên bản, nhưng các điều khoản nhóm vẫn khi tôi chạy "dumpdata" lệnh:

[ 
{ 
    "fields": { 
     "name": "Site Editor", 
     "permissions": [ 
      [ 
       "add_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "change_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "delete_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "add_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "change_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "delete_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "add_revision", 
       "reversion", 
       "revision" 
      ], 
      [ 
       "change_revision", 
       "reversion", 
       "revision" 
      ], 
      [ 
       "delete_revision", 
       "reversion", 
       "revision" 
      ], 
      [ 
       "add_version", 
       "reversion", 
       "version" 
      ], 
      [ 
       "change_version", 
       "reversion", 
       "version" 
      ], 
      [ 
       "delete_version", 
       "reversion", 
       "version" 
      ], 
      [ 
       "add_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "change_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "delete_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "add_site", 
       "sites", 
       "site" 
      ], 
      [ 
       "change_site", 
       "sites", 
       "site" 
      ], 
      [ 
       "delete_site", 
       "sites", 
       "site" 
      ] 
     ] 
    }, 
    "model": "auth.group", 
    "pk": 2 
}] 

Khi tôi cố gắng chạy "LoadData" lệnh, tôi vẫn tiếp tục chạy vào lỗi này:

django.core.serializers.base.DeserializationError: 
Problem installing fixture '/Users/me/Documents/Sites/project/path/fixtures/configuration.json': 
ContentType matching query does not exist. 

giải pháp của tôi là chỉ cần loại bỏ bất kỳ tài liệu tham khảo để trao trả và các phiên bản trong trận đấu chính nó, như vậy:

[ 
{ 
    "fields": { 
     "name": "Site Editor", 
     "permissions": [ 
      [ 
       "add_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "change_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "delete_logentry", 
       "admin", 
       "logentry" 
      ], 
      [ 
       "add_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "change_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "delete_group", 
       "auth", 
       "group" 
      ], 
      [ 
       "add_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "change_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "delete_session", 
       "sessions", 
       "session" 
      ], 
      [ 
       "add_site", 
       "sites", 
       "site" 
      ], 
      [ 
       "change_site", 
       "sites", 
       "site" 
      ], 
      [ 
       "delete_site", 
       "sites", 
       "site" 
      ] 
     ] 
    }, 
    "model": "auth.group", 
    "pk": 2 
}] 

Sau đó, tôi đã có thể nhập khẩu các vật cố mà không vấn đề.

0

Từ django 1.7, tùy chọn dumpdata đã thay đổi: thấy http://polarhome.com:753/doc/python-django-doc/html/topics/serialization.html

Vì vậy, bạn có sử dụng:

python manage.py dumpdata --natural-foreign --natural-primary --exclude > my_fixture.json 
python manage.py loaddata my_fixture.json 

Ngoài ra, người ta cũng có thể giải quyết các nguyên nhân gốc rễ: đảm bảo các loại nội dung phù hợp trong cơ sở dữ liệu nguồn và đích. Tôi phải đối mặt với cùng một lỗi di chuyển dữ liệu xung quanh giữa các cơ sở dữ liệu trong đó db1 vẫn có loại nội dung từ các ứng dụng đã bị xóa trong thời gian có nghĩa. Nhập khẩu chúng trong db2, nơi các ứng dụng không bao giờ trình bày kết quả trong thông báo lỗi này.

Trong trường hợp này, hãy chỉnh sửa cấp cơ sở dữ liệu-bảng django_content_type trong db1 và xóa các loại nội dung không được sử dụng nữa trong ứng dụng django. Sau đó di chuyển hoặc sao chép dữ liệu sang db2 một lần nữa.

Nếu loại nội dung được tham chiếu trong các bảng khác, trước tiên bạn có thể cần xóa chúng ở đó hoặc sử dụng lệnh DROP CASCADE (rủi ro!).

CẢNH BÁO: Chỉnh sửa ở cấp cơ sở dữ liệu là một doanh nghiệp rủi ro, do đó hãy chắc chắn thực hiện sao lưu trước khi tham gia và không thực hiện việc này trên cơ sở dữ liệu sản xuất.

Tùy thuộc vào loại cơ sở dữ liệu, bạn sẽ cần một công cụ khác để thực hiện chỉnh sửa.

mysql -> [MySQLWorkBench][1] 
postgres -> [pgAdmin][2] 
SQLite -> [SQLite Browser][3] 
0

Trong một số trường hợp, lỗi này xảy ra khi cố của bạn chứa tham chiếu đến một mô hình không tồn tại, hoặc là bởi vì nó chưa được cài đặt hoặc ứng dụng của nó đã không được thêm INSTALLED_APPS của bạn. Thật không may, thông báo lỗi của Django là khá vô ích khi theo dõi này xuống.

Nếu bạn chỉnh sửa các phương pháp Queryset.get trong django/db/models/query.py để in ra *args**kwargs trôi qua, bạn sẽ nhận được một thông báo lỗi hữu ích hơn như:

DeserializationError: Problem installing fixture ... ContentType matching query does not exist. args=() kwargs={'model': u'somenewmodel', 'app_label': u'somenewapp'} 

Sau đó, bạn có thể kiểm tra xem mô hình này/ứng dụng được cài đặt hoặc xóa các bản ghi đó khỏi lịch thi đấu của bạn.

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