模型的 Django 默认信息

Django default information for model

我有 2 个模型(时间轴模型将包含我必须上传的默认信息,Pdf 模型包含文件和与时间轴单元格之一的关系)。我被告知创建我自己的迁移文件并完成了以下操作,但我收到此错误并且我在网上找不到任何相关信息:

 File "/Users/fetz/Desktop/parentsuportal/parentsuportal/timeline/migrations/0005_auto_20200324_1721.py", line 33, in addData
    Timeline(header = "Transport Support", age = "18-25")
  File "/usr/local/lib/python3.7/site-packages/django/db/models/base.py", line 520, in __hash__
    raise TypeError("Model instances without primary key value are unhashable")
TypeError: Model instances without primary key value are unhashable

我的模特:

HEADER_CHOICES = [
    ('Financial Support', 'Financial Support'),
    ('Educational Support', 'Educational Support'),
    ('Governmental Support', 'Governmental Support '),
    ('Charity Support Groups', 'Charity Support Groups'),
    ('Therapy Support', 'Therapy Support '),
    ('Transport Support', 'Transport Support ')
]
AGE_CHOICES = [
    ('0-4', '0-4'),
    ('4-11', '4-11'),
    ('11-18', '11-18'),
    ('18-25', '18-25')
]

class Timeline(models.Model):
    header = models.CharField(max_length=30, choices=HEADER_CHOICES)
    age = models.CharField(max_length=6, choices=AGE_CHOICES)

class Pdf(models.Model):
    pdf = models.FileField(upload_to='timelinepdfs')
    timeline = models.ForeignKey(Timeline, on_delete=models.CASCADE)

我的迁移文件:

from django.db import migrations

def addData(apps, schema_editor):
    # We can't import the Person model directly as it may be a newer
    # version than this migration expects. We use the historical version.
    Timeline = apps.get_model("timeline", "Timeline")
    timeline = {
        Timeline(header = "Financial Support", age = "0-4"),
        Timeline(header = "Financial Support", age = "4-11"),
        Timeline(header = "Financial Support", age = "11-18"),
        Timeline(header = "Financial Support", age = "18-25"),
        Timeline(header = "Educational Support", age = "0-4"),
        Timeline(header = "Educational Support", age = "4-11"),
        Timeline(header = "Educational Support", age = "11-18"),
        Timeline(header = "Educational Support", age = "18-25"),
        Timeline(header = "Governmental Support", age = "0-4"),
        Timeline(header = "Governmental Support", age = "4-11"),
        Timeline(header = "Governmental Support", age = "11-18"),
        Timeline(header = "Governmental Support", age = "18-25"),
        Timeline(header = "Charity Support Groups", age = "0-4"),
        Timeline(header = "Charity Support Groups", age = "4-11"),
        Timeline(header = "Charity Support Groups", age = "11-18"),
        Timeline(header = "Charity Support Groups", age = "18-25"),
        Timeline(header = "Therapy Support", age = "0-4"),
        Timeline(header = "Therapy Support", age = "4-11"),
        Timeline(header = "Therapy Support", age = "11-18"),
        Timeline(header = "Therapy Support", age = "18-25"),
        Timeline(header = "Transport Support", age = "0-4"),
        Timeline(header = "Transport Support", age = "4-11"),
        Timeline(header = "Transport Support", age = "11-18"),
        Timeline(header = "Transport Support", age = "18-25")
    }
    timeline.save()

class Migration(migrations.Migration):

    dependencies = [
        ('timeline', '0004_auto_20200323_1947'),
    ]

    operations = [
         migrations.RunPython(addData),
    ]

您需要先保存时间轴实例,然后才能在集合中使用它。这是因为集合使用 __hash__ 方法来标识实例(以便集合具有唯一项),而 Django 模型 class 的 __hash__ 方法需要 pk。解决方案是使用不同的集合 class,例如列表并对其进行迭代。

timelines = [
    Timeline(header = "Financial Support", age = "0-4"),
    Timeline(header = "Financial Support", age = "4-11"),
    ...
]
for timeline in timelines:
    timeline.save()

或者您可以使用:

Timeline.objects.create(header = "Financial Support", age = "0-4")
Timeline.objects.create(header = "Financial Support", age = "4-11")
...

或者如果您担心它们已经存在:

Timeline.objects.get_or_create(header = "Financial Support", age = "0-4")
Timeline.objects.get_or_create(header = "Financial Support", age = "4-11")
...