2012-10-03 38 views
7

Tôi đang chuyển dự án từ Rails đến Django bằng cơ sở dữ liệu cũ. Trong Rails, tôi đã có một liên kết đa hình cho phép tôi thêm chú thích vào bất kỳ hàng nào trong cơ sở dữ liệu. Tôi đang cố gắng thực hiện điều tương tự trong ứng dụng Django. Tôi tìm thấy tài liệu về Quan hệ chung và có vẻ hoàn hảo. Thật không may, trước tiên tôi cần phải tạo các trường mới trong cơ sở dữ liệu cũ của mình để giữ id ContentType cho các mô hình có liên quan. Tôi chỉ sử dụng các hiệp hội đa hình với 2 bảng, vì vậy tất cả tôi cần là hai id tương ứng từ ứng dụng Django, nhưng tôi dường như không thể tìm thấy lệnh thích hợp để tìm kiếm một ContentType id trong Django.Nhận ID ContentType ở Django cho mối quan hệ chung

Bất kỳ đề xuất nào được chào đón nhiều nhất. Tôi đã thử tìm kiếm thông qua các câu hỏi trước nhưng dường như không thể tìm thấy những gì tôi đang tìm kiếm. Cảm ơn bạn rất nhiều vì đã dành thời gian và giúp đỡ.

Trả lời

11

từ https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#django.contrib.contenttypes.generic.GenericForeignKey

bạn có thể làm:

>>> b = Bookmark.objects.get(url='https://www.djangoproject.com/') 
>>> bookmark_type = ContentType.objects.get_for_model(b) 
>>> TaggedItem.objects.filter(content_type__pk=bookmark_type.id, 
...       object_id=b.id) 

vì vậy chỉ cần nhanh chóng một thể hiện của mô hình của bạn và sau đó làm ContentType.objects.get_for_model(<instance>).id

Tôi nghĩ rằng có một cách để vượt qua chỉ là tên mô hình, quá ... cho tôi biết nếu điều đó có hiệu quả hơn không và tôi sẽ cố gắng tìm nó; Tôi đã sử dụng nó trong quá khứ.

+0

Cảm ơn! Có vẻ như tôi có thể đã nhận được câu trả lời mà tôi cần trước đây, tôi chỉ không nhận ra nó. Các chuỗi ContentType có thường là chuỗi không? Mỗi số được theo sau bởi một 'L' - content_type_id cho Thư là "43L" cho Bài tập là "44L". –

+0

Vì vậy, tôi vẫn không biết những gì là với 'L', nhưng tôi chỉ làm những gì tôi cần phải làm ở nơi đầu tiên và đi vào cơ sở dữ liệu cơ bản để nhìn vào bảng. Chắc chắn, những con số tôi đã nhận được là chính xác nhưng L là hư không được tìm thấy. Kỳ dị. Nhưng nhiều, rất cám ơn! –

+0

L là một điều Django rất khó chịu - loại id là "dài int" trong db, vì vậy trong một số trường hợp nó đi kèm với L nối. Nếu bạn cast nó vào một int ('int (44L)'), bạn sẽ nhận được 44. – Colleen

3

Bạn cũng có thể lấy ContentType ID mà không tạo một thể hiện, hiệu quả hơn nếu bạn không có và không cần một cá thể mà chỉ muốn lấy ContentType ID theo tên mẫu.

ContentType.objects.get(model='bookmark').id

Ghi chú: nếu tên của mô hình của bạn là chữ hoa, hãy sử dụng chữ thường để tìm kiếm. Ví dụ: model = 'bookmark' thay vì 'Bookmark'

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