通用多对多关系

2024-01-26

我正在尝试创建一个消息传递系统,其中消息的发送者和接收者可以是通用实体。这对于发件人来说似乎很好,其中只有要引用的对象(GenericForeignKey),但我不知道如何为收件人解决这个问题(GenericManyToManyKey ??)

下面是一个简化的示例。 PersonClient 和 CompanyClient 继承了 Client 的属性,但有自己的特定细节。最后一行是症结所在。如何允许消息接收者成为一组 CompanyClients 和 PersonClients

  class Client(models.Model):
      city = models.CharField(max_length=16)

      class Meta:
          abstract = True

  class PersonClient(Client):
      first_name = models.CharField(max_length=16)
      last_name = models.CharField(max_length=16)
      gender = models.CharField(max_length=1)

  class CompanyClient(Client):
      name = models.CharField(max_length=32)
      tax_no = PositiveIntegerField()

  class Message(models.Model):
      msg_body = models.CharField(max_length=1024)
      sender = models.ForeignKey(ContentType)
      recipients = models.ManyToManyField(ContentType)

您可以通过手动创建消息和收件人之间的联结表,使用通用关系来实现此目的:

from django.db import models
from django.contrib.contenttypes import generic
from django.contrib.contenttypes.models import ContentType

class Client(models.Model):
    city = models.CharField(max_length=16)

    # These aren't required, but they'll allow you do cool stuff
    # like "person.sent_messages.all()" to get all messages sent
    # by that person, and "person.received_messages.all()" to
    # get all messages sent to that person.
    # Well...sort of, since "received_messages.all()" will return
    # a queryset of "MessageRecipient" instances.
    sent_messages = generic.GenericRelation('Message',
        content_type_field='sender_content_type',
        object_id_field='sender_id'
    )
    received_messages = generic.GenericRelation('MessageRecipient',
        content_type_field='recipient_content_type',
        object_id_field='recipient_id'
    )

    class Meta:
        abstract = True

class PersonClient(Client):
    first_name = models.CharField(max_length=16)
    last_name = models.CharField(max_length=16)
    gender = models.CharField(max_length=1)

    def __unicode__(self):
        return u'%s %s' % (self.last_name, self.first_name)

class CompanyClient(Client):
    name = models.CharField(max_length=32)
    tax_no = models.PositiveIntegerField()

    def __unicode__(self):
        return self.name

class Message(models.Model):
    sender_content_type = models.ForeignKey(ContentType)
    sender_id = models.PositiveIntegerField()
    sender = generic.GenericForeignKey('sender_content_type', 'sender_id')
    msg_body = models.CharField(max_length=1024)

    def __unicode__(self):
        return u'%s...' % self.msg_body[:25]

class MessageRecipient(models.Model):
    message = models.ForeignKey(Message)
    recipient_content_type = models.ForeignKey(ContentType)
    recipient_id = models.PositiveIntegerField()
    recipient = generic.GenericForeignKey('recipient_content_type', 'recipient_id')

    def __unicode__(self):
        return u'%s sent to %s' % (self.message, self.recipient)

您可以像这样使用上述模型:

>>> person1 = PersonClient.objects.create(first_name='Person', last_name='One', gender='M')
>>> person2 = PersonClient.objects.create(first_name='Person', last_name='Two', gender='F')
>>> company = CompanyClient.objects.create(name='FastCompany', tax_no='4220')
>>> company_ct = ContentType.objects.get_for_model(CompanyClient)
>>> person_ct = ContentType.objects.get_for_model(person1) # works for instances too.

# now we create a message:

>>> msg = Message.objects.create(sender_content_type=person_ct, sender_id=person1.pk, msg_body='Hey, did any of you move my cheese?')

# and send it to a coupla recipients:

>>> MessageRecipient.objects.create(message=msg, recipient_content_type=person_ct, recipient_id=person2.pk)
>>> MessageRecipient.objects.create(message=msg, recipient_content_type=company_ct, recipient_id=company.pk)
>>> MessageRecipient.objects.count()
2

正如您所看到的,这是一个更加冗长(复杂?)的解决方案。我可能会保持简单并采用下面 Prariedogg 的解决方案。

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

通用多对多关系 的相关文章

  • 如何迭代按值排序的 Python 字典?

    我有一本字典 比如 a 6 b 1 c 2 我想迭代一下by value 不是通过键 换句话说 b 1 c 2 a 6 最直接的方法是什么 sorted dictionary items key lambda x x 1 对于那些讨厌 la
  • Python逻辑运算符优先级[重复]

    这个问题在这里已经有答案了 哪个运算符优先4 gt 5 or 3 lt 4 and 9 gt 8 这会被评估为真还是假 我知道该声明3 gt 4 or 2 lt 3 and 9 gt 10 显然应该评估为 false 但我不太确定 pyth
  • Django 模型在模板中不可迭代

    我试图迭代模型以获取列表中的第一个图像 但它给了我错误 即模型不可迭代 以下是我的模型和模板的代码 我只需要获取与单个产品相关的列表中的第一个图像 模型 py class Product models Model title models
  • Argparse nargs="+" 正在吃位置参数

    这是我的解析器配置的一小部分 parser add argument infile help The file to be imported type argparse FileType r default sys stdin parser
  • 如何在 pytest 中将单元测试和集成测试分开

    根据维基百科 https en wikipedia org wiki Unit testing Description和各种articles https techbeacon com devops 6 best practices inte
  • 忽略 Mercurial hook 中的某些 Mercurial 命令

    我有一个像这样的善变钩子 hooks pretxncommit myhook python path to file myhook 代码如下所示 def myhook ui repo kwargs do some stuff 但在我的例子中
  • 如何计算numpy数组中元素的频率?

    我有一个 3 D numpy 数组 其中包含重复的元素 counterTraj shape 13530 1 1 例如 counterTraj 包含这样的元素 我只显示了几个元素 array 136 129 130 103 102 101 我
  • Pandas 数据帧到 numpy 数组 [重复]

    这个问题在这里已经有答案了 我对 Python 很陌生 经验也很少 我已经设法通过复制 粘贴和替换我拥有的数据来使一些代码正常工作 但是我一直在寻找如何从数据框中选择数据 但无法理解这些示例并替换我自己的数据 总体目标 如果有人真的可以帮助
  • 切片 Dataframe 时出现 KeyError

    我的代码如下所示 d pd read csv Collector Output csv df pd DataFrame data d dfa df copy dfa dfa rename columns OBJECTID Object ID
  • 如何通过在 Python 3.x 上按键来启动和中断循环

    我有这段代码 当按下 P 键时会中断循环 但除非我按下非 P 键 否则循环不会工作 def main openGame while True purchase imageGrab if a sum gt 1200 fleaButton ti
  • 从 python 发起 SSH 隧道时出现问题

    目标是在卫星服务器和集中式注册数据库之间建立 n 个 ssh 隧道 我已经在我的服务器之间设置了公钥身份验证 因此它们只需直接登录而无需密码提示 怎么办 我试过帕拉米科 它看起来不错 但仅仅建立一个基本的隧道就变得相当复杂 尽管代码示例将受
  • 如何设置 Celery 来调用自定义工作器初始化?

    我对 Celery 很陌生 我一直在尝试设置一个具有 2 个独立队列的项目 一个用于计算 另一个用于执行 到目前为止 一切都很好 我的问题是执行队列中的工作人员需要实例化一个具有唯一 object id 的类 每个工作人员一个 id 我想知
  • 如何使用列表作为pandas数据框中的值?

    我有一个数据框 需要列的子集包含具有多个值的条目 下面是一个带有 运行时 列的数据框 其中包含程序在各种条件下的运行时 df condition a runtimes 1 1 5 2 condition b runtimes 0 5 0 7
  • 创建嵌套字典单行

    您好 我有三个列表 我想使用一行创建一个三级嵌套字典 i e l1 a b l2 1 2 3 l3 d e 我想创建以下嵌套字典 nd a 1 d 0 e 0 2 d 0 e 0 3 d 0 e 0 b a 1 d 0 e 0 2 d 0
  • 使用 NumPy 将非均匀数据从文件读取到数组中

    假设我有一个如下所示的文本文件 33 346 1223 10 23 11 23 12 23 13 23 14 23 15 23 16 24 10 24 11 24 12 24 13 24 14 24 15 24 16 25 14 25 15
  • 默认情况下,Keras 自定义层参数是不可训练的吗?

    我在 Keras 中构建了一个简单的自定义层 并惊讶地发现参数默认情况下未设置为可训练 我可以通过显式设置可训练属性来使其工作 我无法通过查看文档或代码来解释为什么会这样 这是应该的样子还是我做错了什么导致默认情况下参数不可训练 代码 im
  • 使用 PyTorch 分布式 NCCL 连接失败

    我正在尝试使用 torch distributed 将 PyTorch 张量从一台机器发送到另一台机器 dist init process group 函数正常工作 但是 dist broadcast 函数中出现连接失败 这是我在节点 0
  • Elastic Beanstalk 中的 enum34 问题

    我正在尝试在 Elastic Beanstalk 中设置 django 环境 当我尝试通过requirements txt 文件安装时 我遇到了python3 6 问题 File opt python run venv bin pip li
  • Python 无法使用套接字绑定我的外部/公共 IP 地址,给出错误但是当使用本地 IP 地址时,错误不会显示

    这是出现主要错误的代码 与我的本地 IP 的绑定将起作用 s bind 192 168 1 4 port 与我的公共 IP 的绑定失败并出现以下错误 s bind 99 99 99 99 port WinError 10049 请求的地址在
  • 迭代 pandas 数据框的最快方法?

    如何运行数据框并仅返回满足特定条件的行 必须在之前的行和列上测试此条件 例如 1 2 3 4 1 1 1999 4 2 4 5 1 2 1999 5 2 3 3 1 3 1999 5 2 3 8 1 4 1999 6 4 2 6 1 5 1

随机推荐

  • mySQL 临时表已满

    我正在尝试使用以下语法创建临时 mySQL 表并将其加载到内存中 但遇到 表已满 错误 CREATE TEMPORARY TABLE IF NOT EXISTS tmpHistory ENGINE MEMORY SELECT FROM hi
  • XSLT 中的嵌套 for-each 循环不起作用

    我似乎无法让这个嵌套的 for 循环正常工作 我想在带有 EP 名称和其他详细信息的行中打印 EP 上的所有曲目 第一个 for each 循环中的所有内容都显示正确 但 for each 循环中没有任何内容可以获取曲目 这是我的 XML
  • ruby 正则表达式查找和替换

    我有以下输出 time 15 40 32 81 我想消除 和 这样它看起来像这样 15403281 我尝试做一个 time gsub s 但这没有用 15 40 32 81 gsub
  • 检测 Android TextView 中的剪切

    我的 Android 应用程序中有一个 TextView 它有一个固定的宽度 目前它的重力为 center horitonzal 并且设置了 textSize 9sp 我从 sqlite 数据库中提取要放在此标签上的值 其中一些值太大 无法
  • POST 与 post、GET 与 get

    我意识到两者都可以 但其中一个比另一个更正确吗
  • 如何证明水平列表的合理性?

    我有一个水平导航栏 如下所示 ul li a href About html About a li li a href Contact html Contact a li ul 我使用 CSS 删除项目符号点并使其水平 Navigation
  • paymentQueueRestoreCompletedTransactionsFinished:当队列中应该有交易时,返回一个空队列

    这是我第一次使用 Store Kit 一切都很顺利 直到我尝试恢复购买 我在堆栈溢出上看过其他几篇关于类似问题的帖子 但我还没有找到适合我的解决方案 我的应用程序中有一个按钮可以调用 SKPaymentQueue defaultQueue
  • Amazon RDS Aurora 与 RDS MySQL 与 EC2 上的 MySQL 比较?

    在云上设置数据库时 我一直在寻找最佳实践 但我仍然不清楚我们应该采用以下哪种解决方案 亚马逊 RDS 极光 亚马逊 RDS MySQL EC2 实例上的 MySQL 我认为 Amazon Aurora 被宣传为更好的选择 但经过一些研究后
  • 服务参考使用数组而不是列表<类型>,即使设置说使用列表

    我正在使用 Visual Studio 2010 并且我有一个对我们创建的 Web 服务的服务引用 我们的方法返回包含通用 List 属性的对象 public class ExampleResponse private System Col
  • AngularJS 密码确认 noMatch 不起作用?

    我这里有这个脚本 angular module UserValidation directive validPasswordC function return require ngModel link function scope elm
  • 在 Chrome 55 中,防止显示 HTML 5 视频的下载按钮 [重复]

    这个问题在这里已经有答案了 I am getting this download button with
  • 通配符 Snakemake 规则的预处理

    我有一个 Snakemake 配方 其中包含一个非常昂贵的准备步骤 对于所有调用来说都很常见 这是用于演示的伪规则 rule sample input name config output name npz run import somem
  • React 中的 refs 是什么?

    我无法理解 React 中的 refs 是什么 我知道它是一个回调函数 你把它放在渲染函数中 但除此之外我无法理解它是什么以及它的目的是什么 引用是您获取已创建组件的句柄的一种方式 ie
  • php Soap - SoapFault 看起来我们没有 XML 文档

    我是一名编程初学者 正在学习使用 Apache2 4 Web 服务器使用 php 和 Soap 进行 Web 服务的教程 本教程使用不带 wsdl 文件的soap Client
  • 文档模板 - 角色设置为亲自或电子邮件签名

    我已经成功创建了一个系统来使用文档模板来创建新信封 该系统具有选项卡式 UI 和 iframe 每次更改选项卡以及 URL 过期时 都会从 Docusign API 获取新 URL 我的问题是现在 一些客户将亲自签名或通过电子邮件签名 阅读
  • 如何在 Mongodb 上对超过 2 个字段进行分页

    如何在 Mongodb 上对超过 2 个字段进行分页 我的数据看起来像这样 id product name price rating search score 要使用 2 个排序字段 价格 id 对下一页进行分页 我正在使用此逻辑 db u
  • scikit-learn 中是否有可用的子空间聚类包

    scikit learn 中是否有任何类型的子空间聚类包可用 如果有人还有兴趣的话 是的 有一个使用 scikit learn 子空间聚类 https github com ChongYou subspace clustering 它是用于
  • 使用 C# 导出 Azure 数据库

    我的 C 程序可与 Azure 数据库配合使用 我正在使用 Microsoft Rest 和 Microsoft Azure Management 库来做一些事情 数据库复制 操作 删除等 我尝试导出 Azure DB 但找不到如何在 C
  • 登录 Facebook 注册回调未调用

    这是我的 onCreate 方法 Override protected void onCreate Bundle bundle super onCreate bundle setContentView R layout activity s
  • 通用多对多关系

    我正在尝试创建一个消息传递系统 其中消息的发送者和接收者可以是通用实体 这对于发件人来说似乎很好 其中只有要引用的对象 GenericForeignKey 但我不知道如何为收件人解决这个问题 GenericManyToManyKey 下面是