ForeignKey
s trên django có thuộc tính on_delete để chỉ định hành vi khi đối tượng được tham chiếu bị xóa. Có cách nào để có được một cái gì đó tương tự cho ManyToManyField?django ManyToManyField và on_delete
Giả sử tôi có mô hình sau
class House(models.Model):
owners = models.ManyToManyField(Person)
Hành vi mặc định là thác, vì vậy nếu tôi xóa một người điều đó xảy ra để sở hữu một ngôi nhà, nó chỉ biến mất từ chủ sở hữu (có nghĩa là, rõ ràng, nó không còn sở hữu bất kỳ nhà nào). Những gì tôi muốn có là nếu một người là chủ sở hữu, nó không thể bị xóa. Đó là, tôi muốn on_delete=models.PROTECT
. Điều này có thể không?
Tôi biết nội bộ ManyToManyField
được dịch sang một mô hình khác với hai ForeignKey
s (trong trường hợp này là một nhà và một người), do đó, có thể đạt được điều này. Bất kỳ ý tưởng làm thế nào để? Tôi muốn tránh đặt thuộc tính through thành mô hình mới, vì điều này sẽ dẫn đến một bảng mới (tôi muốn giữ lại bảng cũ).
Edit: Tôi đã theo dõi nơi django tạo ra mô hình m2m thích hợp:
def create_many_to_many_intermediary_model(field, klass):
from django.db import models
# ...
# Construct and return the new class.
return type(name, (models.Model,), {
'Meta': meta,
'__module__': klass.__module__,
from_: models.ForeignKey(klass,
related_name='%s+' % name,
db_tablespace=field.db_tablespace),
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
})
Dòng có liên quan là
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace)
Tôi muốn nó được
to: models.ForeignKey(to_model,
related_name='%s+' % name,
db_tablespace=field.db_tablespace,
on_delete=models.PROTECT)
Bất kỳ cách nào để làm điều này khác hơn là khỉ vá toàn bộ điều và tạo ra một lớp học mới cho ManyToManyField?
cảm ơn câu trả lời. Tôi không biết tôi có thể di chuyển dữ liệu dễ dàng như vậy, nhưng một bảng thông qua bảng sẽ tạo ra quá nhiều mã bloat cho tôi. Tôi có nhiều ManyToManyField và tôi không muốn có một bảng rõ ràng cho mỗi một trong số họ và do đó tôi quyết định đi với khỉ vá mã và chỉ cần thay thế ManyToManyField với một lớp mới ProtectedManyToManyField – Clash
@Clash.Xin chào, làm thế nào bạn quản lý để thực hiện ProtectedManyToManyField? –
@AndrewFount - Tôi không nghĩ rằng bạn sẽ nhận được thông báo về điều này nếu không, vì vậy tôi đang đề cập đến bạn trong nhận xét này. Clash đăng nó ở đây: http://stackoverflow.com/a/35827978/901641 – ArtOfWarfare