2016-05-13 73 views
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中腳本的微版本,並且有很好的結果。我目前沒有想法;讓我知道你有沒有。

謝謝!

回答

0

在保存細節之前,您需要保存new_incident。新事件發生在數據庫中之前,您正在保存新的詳細信息。

+0

我已經嘗試過這種方式,而且我仍然得到相同的結果。 –

+0

除非我誤解了你的代碼,它總是從數據庫中刪除原始細節。如果您需要對代碼進行任何更改,則必須從備份中還原數據庫才能重試。這是你在做什麼,或者我錯過了什麼? – evergreen

+0

沒有這個意圖。刪除舊的,保存新的。本來我只是試圖修改舊的,但這不起作用,所以我嘗試了幫助。我一直在從備份恢復數據。感謝您與我一起看這個! –