2010-10-21 28 views
8

Tôi có một dự án hiện có với các mô hình (Người dùng và Sách). Tôi muốn thêm một trường ManyToMany (M2M) vào các mẫu sách hiện có, nhưng lệnh syncbb không làm điều này.django thêm một trường/bảng ManyToMany vào lược đồ hiện có, lỗi liên quan đến số

Chi tiết: Sách đã có trường FK ánh xạ tới Người dùng và tôi muốn thêm trường M2M mới (trình đọc) cũng ánh xạ tới Người dùng. Như bạn đã biết, syncdb của Django chỉ quan tâm đến các bảng, vì vậy việc thêm một trường bình thường là dễ dàng, nhưng M2M yêu cầu một bảng nối mới (app_books_user), vì vậy không nên syncdb cmd thêm cái này giống như bất kỳ bảng mới nào khác? Nó đã tạo ra một bảng tham gia khác của tôi cho trường 'người bán' của Sách.

Khi tôi chạy syncdb, ban đầu tôi nhận được lỗi hướng dẫn tôi sử dụng đối số 'related_name' để giúp phân biệt hai tham chiếu đến Người dùng. Tôi đã thêm chúng. Tuy nhiên, khi tôi chạy lại syncdb, nó không tạo bảng nối mới (nhưng bây giờ nó không có lỗi). Trường mới tồn tại khi tôi xem nó thông qua Shell, nhưng không thể sử dụng nó b/c bảng kết nối không tồn tại. Tôi nhìn vào mã sql thông qua 'sqlall' cmd và nó in ra SQL cho bảng mới, nhưng nó không được thực thi.

Tôi đang thiếu gì? Tôi có nên ép buộc SQL (từ sqlall) thông qua trình duyệt cơ sở dữ liệu của tôi không? Liệu có bất kỳ hậu quả nào không? Mã sau:

Models.py

from django.contrib.auth.models import User 

class Seller(models.Model): 
    ... 

class Books(models.Model): 

    name=models.CharField(max_length=50) 
    author=models.ForeignKey(User, related_name='creator') 
    readers=models.ManyToManyField(User, blank=True, related_name='viewers') 
    sellers=models.ManyToManyField(Seller) 

Cảm ơn bạn

+0

Tôi có thể giải quyết vấn đề này bằng cách mở rộng Người dùng bằng UserProfile và giữ 'người đọc' ở đó. – rich

Trả lời

6

syncdb không thay đổi bảng hiện có (mô hình). Điều gì đang xảy ra là mặc dù thêm M2M không sửa đổi một bảng (nó chỉ cần thêm một bảng tham gia), syncdb không tạo bảng mới vì nó thấy rằng mô hình đã có trong db và nó bỏ qua nó. Xem syncdb docs

[syncdb] Tạo bảng cơ sở dữ liệu cho tất cả ứng dụng trong INSTALLED_APPS mà bảng chưa được tạo.

Có một chút khó hiểu, vì bảng kỹ thuật này chưa được tạo nhưng hành vi có ý nghĩa "Có bảng cho mô hình này được tạo không? Yep! Vậy thì đừng đồng bộ hóa nó."

Nói chung, django không cung cấp cơ chế di chuyển lược đồ cơ sở dữ liệu (tức là thêm cột và như vậy). Vì vậy, bạn phải làm điều đó một loại thông qua SQL thô hoặc bằng cách sử dụng một công cụ của bên thứ ba. Tôi khuyên bạn nên kiểm tra số South.

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