Django xóa đối tượng khỏi mối quan hệ ManyToMany


112

Làm cách nào để xóa một đối tượng khỏi mối quan hệ Nhiều-Nhiều mà không xóa đối tượng thực?

Thí dụ:

Tôi có các mô hình MoodsInterest.

Moodcó một trường nhiều-nhiều interests(là một models.ManyToManyField(Interest)).

Tôi tạo một phiên bản của Moodsđược gọi my_mood. Trong my_moodslĩnh vực sở thích của tôi my_interest, nghĩa là

>>> my_mood.interests.all()
[my_interest, ...]

Làm cách nào để xóa my_interestkhỏi my_moodmà không xóa một trong hai trường hợp mô hình? Nói cách khác, làm cách nào để xóa mối quan hệ mà không ảnh hưởng đến các mô hình liên quan?

Câu trả lời:



65

Nếu bạn cần xóa tất cả các tham chiếu M2M mà không chạm vào các đối tượng bên dưới, thì việc làm việc theo hướng khác sẽ dễ dàng hơn:

interest.mood_set.clear()

Mặc dù điều này không trực tiếp giải quyết câu hỏi của OP, nhưng nó thường hữu ích trong tình huống này.


10
Tại sao điều này bị phản đối? Được cho là nó không giải quyết cụ thể câu hỏi của OP, nhưng tôi đã để lại câu trả lời vì nó quan tâm cụ thể đến những người đang vật lộn với việc loại bỏ các quan hệ trong ngữ cảnh M2M và loại bỏ nhu cầu lặp qua các phiên bản. Tôi nghĩ rằng đó là một mẹo hữu ích liên quan.
shacker

2
Điều này chỉ hữu ích cho tôi (tôi đã định lặp lại và không muốn). Cảm ơn vì đã đăng nó!
bwv549

1
nó có thể là tốt hơn nếu bạn chỉ cần thêm thời điểm này trong câu trả lời ở trên
brainLoop

1
Hoặc với tên liên quan trong các mô hình vàinterest.relatedname.clear()
Josh

11

Trong trường hợp của bạn, bạn có thể đơn giản xóa mối quan hệ

my_mood.interests.clear()

Sau đó, có lẽ khi bạn đang tạo lại mối quan hệ mới trong bộ tuần tự của mình, bạn có thể làm điều gì đó như thế này

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
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.