0

我有一个事件表。我有 2 种不同类型的与会者,员工和学生。我想做的是让与会者单独坐在一张桌子上。

事件表包含

     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,在这一点上想避免使用它。)。感谢您的帮助和建议。

4

1 回答 1

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
于 2013-02-07T21:05:05.343 回答