访问模型字段内的模型实例

2024-04-26

我有一个模型(事件),它具有用户模型(事件的所有者)的外键。 该用户可以使用以下 ManyToManyField 邀请其他用户:

    invites = models.ManyToManyField(
                  User, related_name="invited_users", 
                  verbose_name=_("Invited Users"), blank=True
              )

此邀请字段生成一个简单的表,其中包含 ID、event_id 和 user_id。

如果活动所有者删除了他的个人资料,我不希望删除活动,而是将所有权传递给第一个受邀请的用户。

所以我想出了这个功能:

    def get_new_owner():
        try:
            invited_users = Event.objects.get(id=id).invites.order_by("-id").filter(is_active=True)
            if invited_users.exists():
                return invited_users.first()
            else:
                Event.objects.get(id=id).delete()
        except ObjectDoesNotExist:
            pass

这会找到 Event 实例,并返回按 Invite 表 ID 排序的活动受邀用户,因此我可以获得此查询集的第一项,它对应于第一个受邀用户。

为了在用户被删除时运行该函数,我使用了 on_delete=models.SET:

    owner = models.ForeignKey(User, related_name='evemt_owner', verbose_name=_("Owner"), on_delete=models.SET(get_new_owner()))

然后我遇到了一些问题:

  1. 它无法访问我传递的字段的 ID
  2. 我找不到一种方法将它用作类方法或其他东西,所以我不得不将该函数放在模型之上。显然这意味着它无法再访问它下面的类,因此我尝试将事件模型作为函数的参数传递,但无法使其工作。

有任何想法吗?


首先我们可以定义一个策略Owner将使用已更新的对象调用函数的字段。我们可以定义这样的删除,例如在<i.app_name/deletion.py file:

# app_name/deletion.py

def SET_WITH(value):
    if callable(value):
        def set_with_delete(collector, field, sub_objs, using):
            for obj in sub_objs:
                collector.add_field_update(field, value(obj), [obj])
    else:
        def set_with_delete(collector, field, sub_objs, using):
            collector.add_field_update(field, value, sub_objs)
    set_with_delete.deconstruct = lambda: ('app_name.SET_WITH', (value,), {})
    return set_with_delete

你应该通过一个callable to SET,不调用该函数,因此您将其实现为:

from django.conf import settings
from django.db.models import Q
from app_name.deletion import SET_WITH

def get_new_owner(event):
    invited_users = event.invites.order_by(
        'eventinvites__id'
    ).filter(~Q(pk=event.owner_id), is_active=True).first()
    if invited_users is not None:
        return invited_users
    else:
        event.delete()


class Event(models.Model):
    # …
    owner = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        related_name='owned_events',
        verbose_name=_('Owner'),
        on_delete=models.SET_WITH(get_new_owner)
    )

因此,在这里我们将查看邀请以查找将对象转移到的用户。也许您需要排除当前的.owner您的事件的get_new_owner从收集的.inivites.

我们可以,如@AbdulAzizBarkat 说 https://stackoverflow.com/questions/69207710/access-model-instance-inside-model-field/69207958?noredirect=1#comment122322044_69207958,使用 CASCADE 比显式删除更好Eventobject ,因为这将避免无限递归User删除会触发Event删除可能会触发User删除:目前这是不可能的,但稍后如果实现额外的逻辑,可能会出现这种情况。在这种情况下,我们可以使用:

from django.db.models import CASCADE

def SET_WITH(value):
    if callable(value):
        def set_with_delete(collector, field, sub_objs, using):
            for obj in sub_objs:
                val = value(obj)
                if val is None:
                    CASCADE(collector, field, [obj], using)
                else:
                    collector.add_field_update(field, val, [obj])
    else:
        def set_with_delete(collector, field, sub_objs, using):
            collector.add_field_update(field, value, sub_objs)
    set_with_delete.deconstruct = lambda: ('app_name.SET_WITH', (value,), {})
    return set_with_delete

并重写get_new_owner to:

def get_new_owner(event):
    invited_users = event.invites.order_by(
        'eventinvites__id'
    ).filter(~Q(pk=event.owner_id), is_active=True).first()
    if invited_users is not None:
        return invited_users
    else:  # strictly speaking not necessary, but explicit over implicit
        return None
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

访问模型字段内的模型实例 的相关文章

  • 在heroku实例上安装PIL

    我创建了一个python flask托管在heroku上的应用程序 我很有趣PILpython 中的图像库 我无法安装PIL在heroku实例中 我尝试过以下几种方法 方法一 Added PIL 1 1 7 in requirements
  • 使用数据库数据模型生成 SQLAlchemy 模型、架构和 JSON 响应

    将 Flask 和 SQLAlchemy 用于 Python Web 应用程序 我的目标是创建一个系统 在其中我可以 从现有 PostgreSQL 数据库导入数据模型 并将它们映射到相应 SQLAlchemy 模型中的字段 使用这些 SQL
  • 在 Spark-submit 上的 _find_and_load 中获取文件“”,第 991 行

    我目前使用的是Python 3 7 9 spark spark 2 4 6 bin hadoop2 6 在这个项目 venv 中 我的设置为 kafka python 2 0 2 pip 21 2 4 py4j 0 10 9 pyspark
  • 读取 JSON 文件并将其漂亮打印到另一个文件

    我有一个复杂 嵌套 的 json 文本文件 它是文本文件中的一长行 有什么方法可以读取文件 在 python 中 并将 json 缩进 漂亮地打印到新的文本文件中吗 使用读取文件json load 并使用json dump 在指定缩进值时将
  • Python 有哪些 SOAP 客户端库,它们的文档在哪里? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 向 list.extend() 传递不可迭代对象

    我正在创建一个公共方法来允许调用者将值写入设备 例如将其称为 write vals 由于这些值将实时输入 因此我希望通过允许用户输入列表或单个值来简化用户的生活 具体取决于他们需要写入的值的数量 例如 write to device 1 2
  • 冻结(.exe)一个traitsUI程序,现实可行吗?

    我正在尝试使用 cx freeze 或 pyInstaller 冻结一个 TraitsUI 程序 该程序利用 Chaco Traits TraitsUI 以及较小程度的 mayavi 实际上可以取出 我需要它在 mac linux ubun
  • Python 2to3 Windows CMD

    我已经安装了 python 32 包到 C python32 我还设置了路径 Python 路径 C Python32 Lib C Python32 DLLs C Python32 Lib lib tk 路径 C Python32 我想使用
  • Flask 无法识别两个 URL 参数

    我正在尝试将两个参数发送到使用 Flask 路由的 URL If I do curl i http 127 0 0 1 5000 api journeys count startStationName Hansard 20Mews 20Sh
  • Pandas 数据框列总和并收集结果

    给定以下数据框 import pandas as pd p1 name willy age 11 interest Lego p2 name willy age 11 interest games p3 name zoe age 9 int
  • 如何在 Django 中创建多选框?

    我正在尝试创建多选框字段来自姜戈选择 2 https github com applegrew django select2库如下图所示 我使用了下一个代码 但它返回简单的选择多个小部件 我想我忘了补充一些东西 我的错误在哪里 有人可以告诉
  • 如何在这个可嵌套的 For 循环中实现 Robot Framework 风格的变量?

    我在 Robot Framework 中见过很多 嵌套 For 循环 主要是创建一个内部带有 For 循环的关键字 然后在另一个 For 循环中调用该关键字 我使用 Python 2 7 13 制作了一个可嵌套的 For 循环 但因为它主要
  • Django:什么时候运行 makemigrations?

    除了向模型添加 删除 修改字段之外 当我向模型添加或修改方法时 Django 还会检测到更改 所以我的问题是我应该跑步吗makemigrations每次我在模型中更改或添加新方法时 当您添加 更改模型方法时 您不需要运行 manage ma
  • 如何更新多个字段,包括django模型实例的相关字段?

    我想知道 更新多个字段 包括 django 中模型实例的相关字段 的标准方法是什么 Class User models Model id models CharField name models CharField dob models C
  • 第 100 次避免循环导入

    Summary 我继续有一个ImportError在一个复杂的项目中 我已经将其蒸馏到仍然会出现错误的最低限度 Example 巫师有装有绿色和棕色药水的容器 这些可以添加在一起 产生同样是绿色或棕色的新药水 我们有一个PotionABC
  • 随机数生成器每次仅返回一个数字

    Python 是否有一个随机数生成器 每次只返回一个随机整数next 函数被调用 数字不应该重复并且生成器应返回区间内的随机整数 1 1 000 000 这是独一无二的 我需要生成超过一百万个不同的数字 这听起来好像非常消耗内存 以防所有数
  • 捕获 CommandOnCooldown 错误

    我正在制作一个有冷却时间的不和谐机器人 并且我正在尝试制作一个事件 当CommandOnCooldown发生错误时 机器人会通过私信告诉他们需要等待多长时间 这是我的代码 看起来一切正常 但它不知道 retry after 意味着什么 bo
  • Python 中的延迟求值/惰性求值

    我想延迟对类实例的成员函数的调用的评估 直到该实例实际存在 最小工作示例 class TestClass def init self variable 0 self variable 0 variable 0 def get variabl
  • mpld3图,注释问题

    我正在使用 mpld3 在 Intranet 网站上显示图形 我正在使用将图形保存到字典并使用 mpld3 js 在客户端渲染它的选项 除非我想使用注释 否则该图呈现良好 这些显然是抵消的 我不明白为什么 因为即使我将偏移量设置为 0 0
  • Python二进制数据读取

    urllib2 请求接收二进制响应 如下所示 00 00 00 01 00 04 41 4D 54 44 00 00 00 00 02 41 97 33 33 41 99 5C 29 41 90 3D 71 41 91 D7 0A 47 0

随机推荐

  • 城堡单轨铁路和 ELMAH

    有人成功使用 Castle MonoRail 和 ELMAH 吗 我们使用许多 Resuces 向用户提供友好的错误消息 但如果我们这样做 异常永远不会到达 ELMAH 因为 MonoRail 救援会拦截它们 理想情况下 我们希望用户看到救
  • 为什么 (1 in [1,0] == True) 的计算结果为 False?

    当我在寻找答案时这个问题 https stackoverflow com questions 9201445 python best way to keep track of results from loop 我发现我不明白自己的答案 我
  • IE7 Z-Index 分层问题

    我隔离了 IE7 的一个小测试用例z indexbug 但不知道如何修复 我一直在玩z index整天 出什么问题了z index in IE7 测试CSS input border 1px solid 000 div border 1px
  • Python在Conda环境中,但在Windows虚拟环境中尚未激活

    我创建了一个Windows 10 Python虚拟环境 env3 7 3 当我打开在虚拟环境中激活的cmd窗口时 在虚拟环境中启动Python时收到以下警告消息 env3 7 3 C Users redex OneDrive Documen
  • 我应该不断地 open() 和 close() 我的 SQL 数据库还是让它保持打开状态?

    我正在创建一个使用 SQL 数据库来存储数据的应用程序 根据应用程序的设计方式 它将每 3 分钟左右更新一次新数据 具体取决于应用程序运行时的用户操作 在我看到的教程中 他们建议您在更改数据库后关闭数据库 就资源而言 这是 昂贵的 是否最好
  • 在 Angular-UI 模式中显示谷歌地图?

    尝试在 Angular UI 模式中加载简单的谷歌地图 然而没有运气 数据传递得很好 但在地图方面没有任何作用 请帮忙 modalInstance opened then function var mapOptions center new
  • 显示mysql中存储路径的图像

    我已将图像上传到文件夹中并将路径存储到 MySQL 数据库中 路径已存储 图像已成功插入文件夹 但我的问题是当我显示存储在数据库中的路径中的图像时 它没有显示 当我回显图像路径时 它会显示图像路径 我检查了浏览器设置 一切正常 这是我的代码
  • 如何正确处理自定义MapFunction中的错误?

    我已经实施了MapFunction对于我的 Apache Flink 流程 它正在解析传入元素并将其转换为其他格式 但有时会出现错误 即传入数据无效 我看到两种可能的处理方法 忽略无效元素 但似乎我无法忽略错误 因为对于任何传入元素 我必须
  • PDO在mysql性能中的作用

    最近我在浏览一篇博客 注意到有关在mysql中使用PDO的一些要点 它改变了我对PDO的看法 要点是 本机准备好的语句无法利用查询缓存 从而导致性能降低 本机准备好的语句无法执行某些类型的查询 例如 SHOW TABLES 本机准备好的语句
  • Aptana 3 是否提供与 Aptana 1.5.1 一样好的 PHP 插件?

    有人用过 Aptana 3 吗 它的 PHP 插件是否和 2 0 一样糟糕 这里仍然运行 Aptana 1 5 1 一切都是内置的 Aptana Studio 3 是一个很棒的工具 尽管从经验来看 在处理大型项目时会出现一些问题
  • 广播接收器未调用互联网连接检查

    我正在尝试制作一个简单的应用程序 它会在互联网连接发生变化时通知是否有可用的互联网连接 我在互联网上找到了一些解决方案并尝试实施它们 但不知何故它不起作用 我在清单文件中注册的广播接收器没有调用网络连接更改 Manifest
  • 带有 std::variant 或 union 包装器的通用接口

    这个问题与使用 std variant 强制使用通用接口 无需继承 https stackoverflow com questions 72434897 enforcing a common interface with stdvarian
  • python条件运算符中“and”和“&”的奇怪行为[重复]

    这个问题在这里已经有答案了 以下是使用 和 and 条件运算符尝试的不同场景及其结果 使用Python 2 7 使用 运算符 使用 与 运算符 想知道为什么两个条件运算符表现出不同的行为 用真实场景进行解释会很有帮助 提前致谢 is not
  • 如何为批量角色扮演游戏创建保存/加载命令?

    我正在制作一个基于文本的批量角色扮演游戏 RPG 最近才开始学习 我的 RPG 没有生命值之类的东西 它更像是故事类型的 RPG 基本上 你选择你想做的选项 然后继续故事 每个选项都可以改变结局 所以 我想知道是否有办法保存 RPG 中的
  • Windows 上 Matlab 64 位版本的免费 SCM [已关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当 Matlab 安装为 64 位版本时 它只能使用 64 位源代码控制系统 是否有免费的源代码控制系统
  • DbContext 已被处置

    我使用 ASP NET MVC 4 和 SQL Server 2008 开发了一个 Web 应用程序 我创建了 ContextManager 类 以便在所有页面中只有一个数据库上下文 public static class ContextM
  • Python 的 super() 如何处理多重继承?

    如何super 使用多重继承 例如 给定 class First object def init self print first class Second object def init self print second class T
  • 如何从PrepareToInstall事件函数设置StatusMsg

    我的应用程序需要安装 NET Framework 因此我运行 NET 安装准备安装事件函数 当安装运行时 我想在向导上显示一些简单的消息 I found 如何在 Inno 安装脚本的 Code 部分设置状态消息 https stackove
  • 将向量或参数传递给 boost::process (boost::fusion)

    我正在尝试创建一个boost process来自字符串参数向量 void runProcess const std string exe const std vector
  • 访问模型字段内的模型实例

    我有一个模型 事件 它具有用户模型 事件的所有者 的外键 该用户可以使用以下 ManyToManyField 邀请其他用户 invites models ManyToManyField User related name invited u