在 Django 中设置外键属性的默认值

2023-12-23

为模型中的外键字段设置默认值的最佳方法是什么?假设我有两个模型,Student and Exam与学生有exam_taken作为外键。理想情况下我该如何为其设置默认值?这是我的努力日志

class Student(models.Model):
   ....
   .....
   exam_taken = models.ForeignKey("Exam", default=1)

可行,但有预感有更好的方法。

def get_exam():
    return Exam.objects.get(id=1)
    
class Student(models.Model):
    ....
    .....
    exam_taken = models.ForeignKey("Exam", default=get_exam)

但这会失败,并在同步时出现表不存在错误。

任何帮助,将不胜感激。


正如@gareth 中已经暗示的那样answer https://stackoverflow.com/a/9312738,硬编码默认值id价值可能并不总是最好的主意:

If the id数据库中不存在该值,您有麻烦了。即使具体的id值确实存在,对应的对象可能会改变。无论如何,当使用硬编码时id值,您必须诉诸数据迁移或手动编辑现有数据库内容之类的方法。

为了防止这种情况,你可以使用获取或创建() https://docs.djangoproject.com/en/3.0/ref/models/querysets/#get-or-create结合一个unique字段(除id).

这是一种方法:

from django.db import models

 
class Exam(models.Model):
    title = models.CharField(max_length=255, unique=True)
    description = models.CharField(max_length=255)
    
    @classmethod
    def get_default_pk(cls):
        exam, created = cls.objects.get_or_create(
            title='default exam', 
            defaults=dict(description='this is not an exam'),
        )
        return exam.pk
    
    
class Student(models.Model):
    exam_taken = models.ForeignKey(
        to=Exam, on_delete=models.CASCADE, default=Exam.get_default_pk
    )

Here an Exam.title字段用于获取唯一的对象,以及Exam.description字段说明了我们如何使用defaults论证(对于get_or_create) 完全指定默认值Exam object.

请注意,我们返回一个pk,正如建议的docs https://docs.djangoproject.com/en/3.0/ref/models/fields/#default:

对于像这样的领域ForeignKey映射到模型实例,默认值应该是它们引用的字段的值(pk unless to_field已设置)而不是模型实例。

另请注意default可调用对象的评估在Model.__init__() (source https://github.com/django/django/blob/stable/3.0.x/django/db/models/base.py#L474)。因此,如果您的默认值取决于同一模型的另一个字段,或者请求上下文,或者客户端表单的状态,您可能应该看看别处 https://stackoverflow.com/a/1969081.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Django 中设置外键属性的默认值 的相关文章

随机推荐

  • 将 ../ 与 docker-compose 卷一起使用时会发生什么

    我在将文件从 docker 容器内写入主机时遇到问题 我相信这是一个特权问题并且不想设置privileged True 写出文件的解决方法是预先挂起 到我的一卷docker compose yml文件 例如 version 3 servic
  • 了解 VS2010 C# 并行分析结果

    我有一个包含许多独立计算的程序 因此我决定对其进行并行化 我使用 Parallel For Each 对于双核机器来说 结果还不错 大多数时候 CPU 利用率约为 80 90 然而 对于双 Xeon 机器 即 8 核 我只能获得大约 30
  • 延迟 SwiftUI 中的转换

    如何延迟过渡 我想单击一个按钮 然后视图应该延迟转换 我有以下代码 但它没有正确同步 struct ContentView View State var showOne true var body some View VStack if s
  • 调整 UILabel 的大小以适应插图

    我正在构建一个屏幕来扫描条形码 并且我需要在一些屏幕后面放置一个半透明屏幕UILabels以提高浅色背景下的可见度 现在屏幕如下所示 我正在设置背景颜色UILabel得到半透明的盒子 我还创建了一个自定义UILabel子类允许我在边缘之间设
  • 如何知道 S3 存储桶中存储了多少个对象?

    除非我遗漏了什么 否则我看过的 API 似乎都不会告诉你一个对象中有多少个对象
  • Monotouch打开文档-UIDocumentInterationController

    我想在我的 iPhone 应用程序上打开一个用 Monotouch 编写的文档 即在默认 PDF 查看器中启动 PDF 文件 我想我应该使用 UIDocumentInteractionController 任何人对此有任何想法 我已将以下内
  • 生成带有日期的随机时间序列数据

    我正在尝试生成带有日期的随机数据 整数 以便我可以在其上练习 pandas 数据分析命令并绘制时间序列图 temp depth acceleration 2019 01 1 0 218062 1 215978 1 674843 2019 0
  • Russell Libby 的 Pipes 组件

    有谁知道哪里可以下载 Russell Libby 的命名管道 成分 我能找到的所有链接都指向 http home roadrunner com rllibby source html http home roadrunner com rll
  • 在 htaccess 重写规则中附加秘密令牌作为查询字符串有多安全?

    我在尝试提供答案时做了一些测试mod rewrite 重定向但阻止直接访问 https stackoverflow com questions 45326795 mod rewrite redirect but prevent direct
  • 使用 CMake 和 conan 包管理器正确设置 Vulkan、glfw 和 spdlog

    我正在开发 Vulkan API 的渲染器 我在使用 CMake 和 conan 包管理器正确设置项目时遇到了很大的麻烦 让我们看一下我的 conanfile py 的依赖设置 from conans import ConanFile CM
  • 如何在Java中unpickle文件?

    我有一个由 Python 进程创建的 pickle 格式数据文件 实际上是 MCDungeon 缓存文件 我想从 Java 程序中读取此内容 为此 我使用了以下代码 public HashMap
  • 带图像的网格布局

    我正在尝试使用 HTML 和 CSS 为图像构建此网格布局 我想使用 div 而不是 table 但我不确定最好的方法是什么 我还需要在每张图片下面添加一个简短的描述 我使用浮动和padding bottom 底部填充用于模拟元素的高度 这
  • 在卸载之前将 AJAX 发送到服务器 [重复]

    这个问题在这里已经有答案了 所以据说从 Firefox gt 4 开始 https stackoverflow com questions 5398772 firefox 4 onbeforeunload custom message 将窗
  • 我需要帮助解码,这是 json 吗?

    这是json吗 我需要从中回显某些信息 但执行起来遇到困难 我尝试过json decode 但似乎不起作用 a 4 s 5 entry a 1 s 4 type s 10 individual s 5 group a 1 s 6 famil
  • 将二维数组分割成更小的二维数组

    有没有办法将 numpy 中的二维数组分割成更小的二维数组 Example 1 2 3 4 gt 1 2 3 4 5 6 7 8 5 6 7 8 所以我基本上想把一个 2x4 数组切成 2 个 2x2 数组 寻找用于图像的通用解决方案 有另
  • 根据另一列将值映射到特定列

    我有以下问题 A DataFrame含有col1带字符串A B or C 一秒col2与Integer 以及其他三栏col3 col4 and col5 这些列也被命名为A B and C Thus col1 col2 A col3 B c
  • 工作空间和工作目录是什么关系

    我一直在阅读有关 Perforce 的内容 但没有找到任何关于工作空间和工作目录之间关系的全面解释 例如文件如何出现在工作区的工作目录中 如何跟踪它们 工作区文件和工作目录文件之间可能存在哪些不一致等 我来自git背景 所以我正在寻找类似于
  • 子进程退出后内核复制 CoW 页面

    在Linux中 每当一个进程被fork时 父进程的内存映射都是cloned进入子进程 实际上 出于性能原因 页面被设置为写时复制 最初它们是共享的 如果两个进程之一在其中一个进程上写入 那么它们将被共享cloned MAP PRIVATE
  • 如何获取 WooCommerce 中的可用税率

    基于使用 WC Tax get tax classes 获取所有 WooCommerce 税级 https stackoverflow com questions 66196547 using wc taxget tax classes t
  • 在 Django 中设置外键属性的默认值

    为模型中的外键字段设置默认值的最佳方法是什么 假设我有两个模型 Student and Exam与学生有exam taken作为外键 理想情况下我该如何为其设置默认值 这是我的努力日志 class Student models Model