2011-10-25 31 views
8

khi tôi cần phải loại bỏ một đối tượng từ ORM declarative nhiều-nhiều mối quan hệ, nên anh phải để làm điều này:Làm thế nào để loại bỏ tất cả các mục từ bộ sưu tập nhiều-nhiều trong SqlAlchemy?

blogpost.tags.remove(tag) 

Vâng. Tôi phải làm gì nếu tôi cần thanh lọc tất cả các mối quan hệ này (không chỉ một)? Tình hình điển hình: Tôi muốn thiết lập một danh sách các thẻ mới cho bài đăng trên blog của tôi. Vì vậy, tôi cần phải ...:

  1. Hủy bỏ tất cả các mối quan hệ hiện có giữa rằng bài đăng trên blog và các thẻ.
  2. Đặt mối quan hệ mới và tạo thẻ mới nếu chúng không tồn tại.

Tất nhiên, có thể có cách tốt hơn để thực hiện việc này. Trong trường hợp đó, hãy cho tôi biết.

Trả lời

18

Đây là thành ngữ Python chuẩn cho thanh toán bù trừ một danh sách - gán cho “toàn bộ danh sách” lát:

blogpost.tags[:] = [] 

Thay vì danh sách rỗng, bạn có thể muốn nhượng bộ mới của thẻ trực tiếp.

blogpost.tags[:] = new_tags 

quan hệ SQLAlchemy của là instrumented attributes, có nghĩa là họ giữ giao diện của một danh sách (hoặc thiết lập, dict, vv), nhưng bất kỳ thay đổi được phản ánh trong cơ sở dữ liệu. Điều này có nghĩa rằng bất cứ điều gì bạn có thể làm với một danh sách là có thể với một mối quan hệ, trong khi SQLA minh bạch lắng nghe những thay đổi và cập nhật cơ sở dữ liệu cho phù hợp.

+7

Hoặc đặt cách khác: SQLAlchemy thật tuyệt vời. – ereOn

+1

Tại sao không chỉ 'blogpost.tags = new_tags'? (không có [:]) – Devi

+1

Khi tôi thử điều này ngay bây giờ (Tháng 12 năm 2014, SQLAlchemy 0.9) Tôi nhận được đối tượng "TypeError: 'AppenderBaseQuery' không hỗ trợ gán mục." –

5

Mâu thuẫn với những gì Two-Bit Alchemist đã báo cáo.

blogpost.tags[:] = new_tags 

sẽ phàn nàn về

TypeError: 'AppenderBaseQuery' object does not support item assignment 

Nhưng

blogpost.tags = new_tags 

dường như làm việc tốt.

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