【问题标题】:Using the SQL initialization hook with ManytoManyField将 SQL 初始化挂钩与 ManytoManyField 一起使用
【发布时间】:2014-10-31 17:55:25
【问题描述】:

我对 Django 还很陌生,我正在尝试使用 django 的钩子将一些“主机”数据添加到“记录”以使用 SQL 进行初始化(应用文件夹和 sql 子文件夹中的小写 SQL 文件)

这是模型:

class Record(models.Model):
    species = models.TextField(max_length = 80)
    data=models.TextField(max_length = 700)
    hosts = models.ManyToManyField('Host')

class Host(models.Model):
    hostname = models.TextField()

我使用了 ManyToManyField,因为每条记录应该能够有多个主机,并且主机应该是“可重复使用的”:即能够出现在许多记录中。

当我尝试通过 SQL 插入时,我有

INSERT INTO myapp_record VALUES ('Species name', 'data1', XYZ);

如果我想要主机 1、2 和 3,我不确定要为 XYZ(ManytoMany)添加什么

用逗号分隔它们显然不起作用,我尝试了一个元组,但也没有。 我应该尝试插入 Django 制作的中间表吗?这和我正在使用的钩子有类似的钩子吗?如果没有,如何在该表上执行 SQL 插入?

【问题讨论】:

  • 如果我这样做,Record 的初始化会(正确地)抱怨缺少一个值(主机字段)。我想我可以首先允许 hosts 字段为空,然后将其添加到中介,但我的印象是 Django 处理的重点是我不应该这样做。那时我还有几百行要手动执行,所以如果有任何方法可以在插入记录的同时做到这一点,这是我更喜欢的,如果需要,我当然会做我必须做的。

标签: python sql django


【解决方案1】:

初始SQL数据文件的使用是deprecated。相反,您应该使用数据迁移,它可能看起来像这样:

from django.db import models, migrations

def create_records(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.
    Record = apps.get_model("yourappname", "Record")
    Host = apps.get_model("yourappname", "Host")
    host1 = Host.objects.get(hostname='host1')
    record = Record.objects.create(name='Species name', data='Data')
    record.hosts.add(host1)
    ...etc...

class Migration(migrations.Migration):

    dependencies = [
        ('yourappname', '0001_initial'),
    ]

    operations = [
        migrations.RunPython(create_records),
    ]

【讨论】:

  • 我希望您能理解,我非常不愿意迁移到新版本的 Django(至少不到 1 周)以使用需要相对较大的工作和迁移的系统将知识实施到解决方案中。目前在官方文档之外基本上没有新手支持,并且假设我想要的东西可以通过一些我没有的语法简单地完成,你肯定会明白为什么我不会这样做。
猜你喜欢
  • 1970-01-01
  • 2021-10-01
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2020-06-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
相关资源
最近更新 更多