Django的模型默认信息

问题描述 投票:0回答:1

我有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),
    ]
django django-models django-migrations
1个回答
0
投票

您需要先保存时间轴实例,然后再将其用于集合中。这是因为集合使用__hash__方法来标识实例(以便该集合具有唯一项),并且Django Model类的__hash__方法需要pk。解决方案是使用其他集合类,例如列表并对其进行迭代。

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")
...
© www.soinside.com 2019 - 2024. All rights reserved.