簡體   English   中英

在多對多關系中合並模型對象

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM