2013-02-07 25 views
0

我有一个Event表。我有两种不同类型的与会者,员工和学生。我想要做的是让参加者在一张特殊的表格中。将django数据移动/迁移到新表中

事件表保存:

 created = models.DateTimeField(auto_now_add=True) 
    modified = models.DateTimeField(auto_now=True) 
    name = models.CharField(max_length=200) 
    location = models.CharField(max_length=200) 
    start_date = models.DateTimeField(auto_now=False, auto_now_add=False) 
    about = models.TextField(null=True, blank=True) 

    student_attendees = models.ManyToManyField(StudentProfile, null=True, blank=True) 
    staff_attendees = models.ManyToManyField(StaffProfile, null=True, blank=True) 

与会者表将有:

 event = models.ForeignKey(Event) 
    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    profile = generic.GenericForeignKey('content_type', 'object_id') 
    created = models.DateTimeField(auto_now_add=True) 

我怎么会去转移或事件的学生&人员与会者的数据迁移到它的自己的参加者表。 (我没有使用South,并且此时想避免使用它。)。感谢您的帮助和建议。

+0

南由做正是这一点。你为什么想要避免它? – Rod

回答

3

您可以将数据转储到json中,然后手动将它们分离到不同的灯具中,然后更改表(或重新创建数据库)并加载数据。

或只写一个脚本来手动选择一些领域和咸菜它们或手工转储为JSON,甚至为CSV:

with open('students.csv', 'w') as st_file: 
    writer = csv.writer(st_file) 
    for a in Attendee.objects.filter(profile__status='student'): 
     st_file.writerow(a.event_id, a.content_type, a.object_id, a.profile, ...) 

然后做一个简单的脚本加载数据。

with open('students.csv', 'w') as st_file: 
    reader = csv.reader(st_file) 
    for row in reader: 
     event = Event.objects.get(id=row[0]) 
     event.student_attendees.add(Student.objects.get(row[2])) 

(这意味着object_id是等同于StudentProfile表的新ID)

当然,后面将数据库做这些之前。

其实,有一个更好的办法:

python manage.py dumpdata app.event app.attendee --indent=4 > events.json 

然后编辑以适应新的表,然后

python manage.py loaddata events.json 
+0

听起来很痛苦,开始思考南方或进化。 –

+0

您也可以使用dumpdata&loaddata。 –

+0

您需要再次阅读整个问题。他基本上是问如何在一个简单的执行dumpdata&loaddata不起作用的事实之后将单个模型分成两个模型。 –