Django khóa ngoại tự giới thiệu


165

Tôi là người mới đối với các ứng dụng web và công cụ cơ sở dữ liệu nói chung vì vậy đây có thể là một câu hỏi ngớ ngẩn. Tôi muốn tạo một mô hình ("CategoryModel") với một trường trỏ đến id chính của một thể hiện khác của mô hình (mẹ của nó).

class CategoryModel(models.Model):
    parent = models.ForeignKey(CategoryModel)

Làm thế nào để tôi làm điều này? Cảm ơn!


2
Về mặt phong cách, tôi sẽ đề nghị gọi nó parentthay vì parentId, vì my_category_model.parentsẽ là một ví dụ CategoryModel. Django sẽ tự động tạo một thành viên parent_idsẽ là khóa chính của mô hình liên quan.
10

Câu trả lời:


262

Bạn có thể chuyển tên của một mô hình dưới dạng một chuỗi cho ForeignKey và nó sẽ thực hiện đúng.

Vì thế:

parent = models.ForeignKey("CategoryModel")

Hoặc bạn có thể sử dụng chuỗi "tự"

parent = models.ForeignKey("self")

55

Bạn có thể sử dụng chuỗi 'tự' để biểu thị tự tham chiếu.

class CategoryModel(models.Model):
    parent = models.ForeignKey('self')

https://docs.djangoproject.com/en/dev/ref/models/fields/#forignkey


7
Tôi nghĩ bạn có nghĩa là 'bản thân'. Như trong chuỗi. bản thân không được xác định trong bối cảnh này
Jared Forsyth

1
@Brandon Làm thế nào "cái tôi" trong câu trả lời của bạn khác với những gì jared đã nói trong bình luận của anh ấy? "Tôi nghĩ bạn có nghĩa là" bản thân "!!! . Cả hai đều là chuỗi tốt theo tài liệu django. ! Bất kỳ gợi ý nào
Stryker

1
Sự khác biệt là selfkhông có mặt khi xác định thuộc tính mô hình. Nếu thuộc tính được định nghĩa là một phần của __init__()phương thức hoặc phương thức khác, thì đó sẽ selfluôn là đối số vị trí đầu tiên cho bất kỳ phương thức cá thể nào của lớp Python.
Brandon


1

Bạn cũng phải giải quyết null = True và blank = True

class CategoryModel(models.Model):
    parent = models.ForeignKey("self", on_delete=models.CASCADE, null=True, blank=True)

null = True, cho phép trong cơ sở dữ liệu
blank = True, cho phép xác thực mẫu

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.