[英]Merging Model Objects in Many to Many Relationship
我正在嘗試將Django應用程序中的某些對象合並在一起。 我痛苦地從Wordpress網站遷移了數據。 該站點是針對警察事件的存檔,我使用與(Details)作為中間模型的多對多關系的兩個模型(事件,官員)。 這是我的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"
問題在於,當前存在重復的事件,案件編號相同,涉及不同的官員。 我試圖將這些合並為一個事件,同時保留“詳細信息”中的所有信息。 這是我嘗試的腳本,無法正常工作。
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()
該腳本的結果是正確創建事件對象,但不會創建詳細信息對象。 我在外殼中嘗試了腳本的微型版本,並取得了良好的效果。 我目前沒有主意; 讓我知道你有沒有。
謝謝!
保存詳細信息之前,需要保存new_incident
。 新事件在數據庫中之前,您正在保存新詳細信息。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.