Я пытаюсь объединить некоторые объекты в моем приложении 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()
Результаты этого скрипта должны правильно создавать объекты инцидента, но объекты деталей не создаются. Я пробовал микро версии скрипта в оболочке и имел хорошие результаты. В настоящее время у меня нет идей; сообщите мне, если у вас есть.
Спасибо!
Я тоже пробовал это так, и я все равно получаю тот же результат. –
Если я не понимаю ваш код, он всегда удаляет исходные данные из базы данных. Если вам нужно внести какие-либо изменения в код, вам нужно будет восстановить db из резервной копии, чтобы повторить попытку. Это то, что ты делаешь, или я что-то упускаю? – evergreen
Нет, это намерение. Удалите старый, сохраните новый. Первоначально я попробовал просто изменить старый, но это не работало, поэтому я попробовал помощь. Я восстанавливаю данные из резервной копии. Спасибо, что посмотрели на меня со мной! –