2016-05-13 2 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" 

Проблема заключается в том, что в настоящее время дублируют инциденты с тем же номером дела, относящиеся к разным офицерам. Я пытаюсь объединить их в один случай, сохраняя всю информацию в деталях. Вот сценарий, который я пробовал, который не совсем работает.

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() 

Результаты этого скрипта должны правильно создавать объекты инцидента, но объекты деталей не создаются. Я пробовал микро версии скрипта в оболочке и имел хорошие результаты. В настоящее время у меня нет идей; сообщите мне, если у вас есть.

Спасибо!

ответ

0

Перед тем, как сохранить данные, необходимо сохранить new_incident. Вы сохраняете новые данные перед тем, как новый инцидент находится в базе данных.

+0

Я тоже пробовал это так, и я все равно получаю тот же результат. –

+0

Если я не понимаю ваш код, он всегда удаляет исходные данные из базы данных. Если вам нужно внести какие-либо изменения в код, вам нужно будет восстановить db из резервной копии, чтобы повторить попытку. Это то, что ты делаешь, или я что-то упускаю? – evergreen

+0

Нет, это намерение. Удалите старый, сохраните новый. Первоначально я попробовал просто изменить старый, но это не работало, поэтому я попробовал помощь. Я восстанавливаю данные из резервной копии. Спасибо, что посмотрели на меня со мной! –

Смежные вопросы