Django ORM - the thao 24h

/imgposts/lrp8ykp8.jpg

Tôi luôn cảm thấy không thoải mái khi sử dụng ORM để xử lý các mối quan hệ phức tạp, bởi vì tôi không nắm rõ cấu trúc bảng cơ sở dữ liệu tương ứng với ORM. Ngoài ra, việc khởi tạo một số thuộc tính phức tạp khi tạo đối tượng Model mới cũng là vấn đề khiến tôi bối rối.

Trong SQLite, Foreign Key chỉ đơn giản là một con số. Ví dụ:

1owner [VSBET](/blog/android-room-no-value-passed-for-parameter-id/)  = models.ForeignKey(User, null=True)

Khi xem schema, chúng ta sẽ thấy rằng cột này được biểu diễn như sau:

"owner_id" integer,

Ví dụ, nếu chúng ta thêm một trường ManyToManyField vào model:

1tags = models.ManyToManyField(Tag) [trò bắn ](/blog/house-plan/) 

Thực tế, điều này sẽ tạo ra một bảng trung gian:

1CREATE TABLE "<tên-app>_<tên-model>_tags" (
2  "id" integer NOT NULL PRIMARY KEY AUTOINCREMENT,
3  "<tên-model>_id" integer NOT NULL,
4  "tag_id" integer NOT NULL REFERENCES "<tên-app>_tag" ("id"),
5  UNIQUE ("<tên-bảng>_id", "tag_id")
6);
7CREATE INDEX "<tên-app>_<tên-model>_tags_b96e4040" ON "<tên-app>_<tên-model>_tags" ("<tên-model>_id");
8CREATE INDEX "<tên-app>_<tên-model>_tags_5659cca2" ON "<tên-app>_<tên-model>_tags" ("tag_id");

Do đó, để thiết lập mối quan hệ này, trước tiên bạn cần lưu (save) một đối tượng model, sau đó lưu một đối tượng tag, và cuối cùng thêm tag vào model rồi lưu lại. Nếu không lưu model hoặc tag trước, bạn sẽ không thể lấy được id của chúng.

Để tránh việc tạo trùng lặp các đối tượng tag, bạn có thể kiểm tra xem tag đã tồn tại hay chưa trước khi tạo mới.

1try:
2    obj = Person.objects.get(first_name='John', last_name='Lennon')
3except Person.DoesNotExist:
4    obj = Person(first_name='John', last_name='Lennon', birthday=date(1940, 10, 9))
5    obj.save()

Chúng ta có thể đơn giản hóa đoạn code trên bằng cách sử dụng get_or_create:

1obj, created = Person.objects.get_or_create(
2    first_name='John', 
3    last_name='Lennon',
4    defaults={'birthday': date(1940, 10, 9)}
5)

Biến created sẽ cho bóng đá ngoại hạng anh trực tiếp hôm nay biết đối tượng vừa được tạo mới hay đã tồn tại trước đó.