tôi có mô hình như vậy:Django: sáp nhập đối tượng
class Place(models.Model):
name = models.CharField(max_length=80, db_index=True)
city = models.ForeignKey(City)
address = models.CharField(max_length=255, db_index=True)
# and so on
Kể từ khi tôi đang nhập khẩu chúng từ nhiều nguồn khác nhau, và người sử dụng trang web của tôi có thể thêm địa danh mới, tôi cần một cách để hợp nhất chúng lại từ một giao diện quản trị. Vấn đề là, tên không phải là rất đáng tin cậy vì chúng có thể được viết theo nhiều cách khác nhau, vv Tôi đang sử dụng để sử dụng một cái gì đó như thế này:
class Place(models.Model):
name = models.CharField(max_length=80, db_index=True) # canonical
city = models.ForeignKey(City)
address = models.CharField(max_length=255, db_index=True)
# and so on
class PlaceName(models.Model):
name = models.CharField(max_length=80, db_index=True)
place = models.ForeignKey(Place)
truy vấn như thế này
Place.objects.get(placename__name='St Paul\'s Cathedral', city=london)
và hợp nhất như này
class PlaceAdmin(admin.ModelAdmin):
actions = ('merge',)
def merge(self, request, queryset):
main = queryset[0]
tail = queryset[1:]
PlaceName.objects.filter(place__in=tail).update(place=main)
SomeModel1.objects.filter(place__in=tail).update(place=main)
SomeModel2.objects.filter(place__in=tail).update(place=main)
# ... etc ...
for t in tail:
t.delete()
self.message_user(request, "%s is merged with other places, now you can give it a canonical name." % main)
merge.short_description = "Merge places"
như bạn có thể thấy, tôi phải cập nhật tất cả các mô hình khác bằng FK để Đặt bằng giá trị mới. Nhưng nó không phải là giải pháp rất tốt vì tôi phải thêm mọi mô hình mới vào danh sách này.
Làm cách nào để "cập nhật xếp chồng" tất cả các khóa ngoài cho một số đối tượng trước khi xóa chúng?
Hoặc có thể có những giải pháp khác để làm/tránh hợp nhất
FWIW tôi thấy ví dụ này toàn diện hơn: http://djangosnippets.org/snippets/2283/ – dpn
Snippet dường như không làm việc cho tôi nữa, không thành công trên ForeignKey. Giao dịch cộng thêm được khấu hao để ủng hộ nguyên tử. Plus iteritems() trở thành các mục() trong python3. (hai vấn đề cuối cùng dễ giải quyết, trước hết là không). – gabn88
Trong việc giải quyết vấn đề đầu tiên tôi phát hiện ra rằng vấn đề có khả năng với groupobjectpermissions của người giám hộ django. Không thể giải quyết nó mặc dù: ( – gabn88