【问题标题】:How Do I create database Models in Django?如何在 Django 中创建数据库模型?
【发布时间】:2023-03-09 06:32:01
【问题描述】:

在直接讨论我的问题之前,我想声明我是 Django 的新手。我的数据库模型是在 Sqlalchemy Flask 中创建的。我也想在我的 Django 应用程序中编写相同的数据库模型。为了简单起见,这是在 Flask 中使用 Sqlalchemy 创建模型的方式。 flask_model.py

class LeadsStatus(db.Model):
    __tablename__ = 'leads_status'
    if leadgenapp.config['TESTING']:
        f_key = 'companies.id'
    else:
        __table_args__ = {'schema': tbl_schema}
        f_key = f'' + tbl_schema + '.companies.id'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    company_id = db.Column(db.Integer, db.ForeignKey(f_key), nullable=False, index=True)
    status = db.Column(db.String(120))
    users_id = db.Column(db.Integer)
    assign_date = db.Column(db.DateTime)

    companies = db.relationship('Companies', backref='leadstatus')

此模型包含一个外键。我的问题是,当我创建相同的模型时,它会抛出一个错误,指出f_key is not defined。 这就是我编写模型的方式。 django_model.py

class LeadsStatus(models.Model):
    __tablename__ = 'leads_status'
    # if leadgenapp.config['TESTING']:
    #     f_key = 'companies.id'
    # else:
    #     __table_args__ = {'schema': tbl_schema}
    #     f_key = f'' + tbl_schema + '.companies.id'

    id = models.IntegerField(primary_key=True, auto_created=True)
    company_id = models.ForeignKey(f_key, nullable=False, index=True, on_delete=models.CASCADE)
    status = models.CharField(max_length=120)
    users_id = models.IntegerField()
    assign_date = models.DateTimeField()
    companies = models.relationship('Companies', backref='leadstatus')

我了解错误的原因,但我不明白如何克服它?如果这个问题听起来微不足道,我深表歉意,但我只是 django 的新手,我不知道 Django 的 ORM 中的情况如何

【问题讨论】:

    标签: python django


    【解决方案1】:

    TL;DR:

    这是 Django 的限制。你不能轻易做到这一点。


    长答案

    我认为 Django ORM 不够灵活,无法进行自定义 ForeignKey,因为它试图降低迁移脚本等复杂性。

    例如,在Sqlalchemy中本身不能自动生成迁移,需要自己编写迁移文件,

    但是在 Django 中,您需要做的是输入命令 python manage makemigrations,然后只要您更改模型架构,您就可以获得数据库的迁移。

    您只需运行相同的命令。 Django 会知道你所做的更改并为此创建一个新的迁移文件。

    所以外键的意义。 Django 需要知道您连接到的确切模型以创建迁移文件。如果您确实喜欢动态外键,那可能会使 Django 在某些模型中执行或映射错误。

    我的建议是请遵循 Django 模型 并忽略架构和数据库。让 Django 为您做这件事,并专注于创建您的出色应用!

    这是我的 2 美分。


    在此链接中阅读更多内容。

    https://docs.djangoproject.com/en/3.1/ref/models/fields/#foreignkey https://docs.djangoproject.com/en/3.1/topics/migrations/

    【讨论】:

    • 据我所知(我从未使用过 Sqlalchemy)technophile_3 实际上并没有动态外键。她/他只是有用于测试和生产的不同数据库(可能是生产中的 Postgres),这就是添加模式的原因。如果我是对的,她/他在 Django 中根本不需要这个——它会在内部处理这个。
    • 感谢您和@wankata 的详细回答和解释。
    【解决方案2】:

    试试这个 - 这应该可以工作

            company_id = models.ForeignKey('Company', nullable=False, index=True, on_delete=models.CASCADE)
    

    基本上第一个参数是模型的名称。本例中的 company_id 将映射到相关表 Company 的主键 (id)。

    顺便说一句 - 您可以尝试使用Imagine smart compiler 从非常简单的配置中为您的 Django 模型(以及 API)生成干净的代码。在其他功能中,它以正确的方式生成代码以在 Django 中建模外键关系。 你也可以在这里试一试imagine.ai/demo

    【讨论】:

      【解决方案3】:

      查看Django's ForeignKey的文档

      您应该为它提供您的模型类而不是表名。

      所以应该是这样的:

      company_id = models.ForeignKey('Company', on_delete=models.CASCADE)
      

      其中“公司”是另一个模型类。

      编辑: 如果你真的需要动态外键,正如 Kanisorn Sutham 建议的那样,你可以阅读Django's contenttypes framework

      【讨论】:

      • 设置 Nullable=False 会引发错误,因为 ' __init__() got an unexpected keyword argument 'nullable''
      • 抱歉,我刚刚复制了您的行并更改了 f_key 引用,这是有问题的引用。您实际上根本不需要 nullable 和 index 选项。默认情况下,FK 不可为空,您不需要索引关系字段。如果你需要它可以为空,你应该使用null 选项而不是可以为空的。
      猜你喜欢
      • 2020-09-11
      • 2014-07-06
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 2018-12-19
      • 1970-01-01
      • 1970-01-01
      • 2015-08-27
      相关资源
      最近更新 更多