0
我想在我的Django應用程序中將一些對象合併在一起。我痛苦地從Wordpress網站遷移了數據。該網站是針對警務人員的事件檔案,我使用兩種模式(事件,官員)與(細節)多對多關係作爲中間模型。這是我的models.py:在多對多關係中合併模型對象
from __future__ import unicode_literals
from django.db import models
class Officer(models.Model):
first_name = models.CharField(max_length=80, blank=True)
last_name = models.CharField(max_length=80, blank=True)
badge = models.IntegerField(blank=True)
department = models.CharField(max_length=50, blank=True)
def __unicode__(self):
return self.last_name + ', ' + self.first_name
class Incident(models.Model):
officers2 = models.ManyToManyField(Officer, through='Details')
case_number = models.CharField(max_length=50, blank=True)
OFFICE_CHOICES = (
('CRA', 'Civilian Review Authority'),
('IA', 'Internal Affairs'),
('OPCR', 'Office of Police Conduct Review'),
)
office = models.CharField(max_length=10,
choices=OFFICE_CHOICES,
)
def __unicode__(self):
return self.case_number
class Details(models.Model):
officer = models.ForeignKey(Officer, on_delete=models.CASCADE)
incident = models.ForeignKey(Incident, on_delete=models.CASCADE)
allegation = models.CharField(max_length=50, blank=True)
finding = models.CharField(max_length=50, blank=True)
action = models.CharField(max_length=50, blank=True)
def __unicode__(self):
return unicode(self.officer.first_name) + ' '+ unicode(self.officer.last_name)+ ', ' + unicode(self.incident)
class Meta():
verbose_name_plural = "details"
問題是,目前有重複的事件與相同的案件號碼有關的不同的軍官。我試圖在保留Details內的所有信息的同時將它們合併成單個事件。這是我試過的腳本,這不太合適。
from __future__ import unicode_literals
from police_archive.models import Incident, Details, Officer
from django.db.models import Count
def run() :
#get list of duplicates
list=Incident.objects.values('case_number').annotate(case_number_count=Count('case_number')).exclude(case_number_count=1)
g= []
#make list of case numbers
for item in list:
g.append(item['case_number'])
#first entry was empty, remove first entry
for number in g[1:] :
#get list of incident objets
old_incidents=Incident.objects.filter(case_number=number);
#make new object to replace old ones
new_incident = Incident(case_number=number)
new_incident.office=old_incidents[0].office
#filter out all details which match one of the incidents
details_list=Details.objects.none()
for incident in old_incidents:
print incident.officer2
results=Details.objects.filter(incident=incident)
details_list = details_list | results
#delete old_incidents so that details can be modified
old_incidents.delete()
#create new details objects pointing to new incident object, delete old details object
for details in details_list:
new_details = Details(incident=new_incident,officer=details.officer, allegation=details.allegation, finding=details.finding, action=details.action)
new_details.save()
details.delete()
#details.save()
new_incident.save()
該腳本的結果是正確創建事件對象,但未創建細節對象。我已經嘗試了shell中腳本的微版本,並且有很好的結果。我目前沒有想法;讓我知道你有沒有。
謝謝!
我已經嘗試過這種方式,而且我仍然得到相同的結果。 –
除非我誤解了你的代碼,它總是從數據庫中刪除原始細節。如果您需要對代碼進行任何更改,則必須從備份中還原數據庫才能重試。這是你在做什麼,或者我錯過了什麼? – evergreen
沒有這個意圖。刪除舊的,保存新的。本來我只是試圖修改舊的,但這不起作用,所以我嘗試了幫助。我一直在從備份恢復數據。感謝您與我一起看這個! –