python - MongoDB EmbeddedField 中的 Django Foreignkey
问题描述
我在我的 Django 项目中使用 MongoDB 的 Djongo 引擎。
我有两张桌子
# app/models.py
# My Main Table
class Questions(models.Model):
questionId = models.UUIDField(default=uuid.uuid4, editable=True, unique=True)
question = models.TextField()
answer = models.EmbeddedField(
model_container=Answers
)
date = models.DateTimeField(auto_now_add=True, blank=True)
User = models.ForeignKey(UserDetailTable,on_delete=models.CASCADE,related_name='userinfo')
和
# app/models.py
# This table needs to be Embedded in Questions Table
class Answers(models.Model):
answerId = models.UUIDField(default=uuid.uuid4, editable=True, unique=True)
answer = models.TextField()
date = models.DateTimeField(auto_now_add=True)
User = models.ForeignKey(UserDetailTable,on_delete=models.CASCADE)
class Meta:
abstract = True
我想嵌入Answers
表格Questions
中。但我收到了这个错误
django.core.exceptions.ValidationError: ['Field "App.Answers.User" of model container:"<class \'App.models.Answers\'>" cannot be of type "<class \'django.db.models.fields.related.ForeignKey\'>"']
我知道这个错误是因为我使用User = models.ForeignKey(UserDetailTable,on_delete=models.CASCADE)
的Answers
本身就是一个 EmbeddedField on Questions
。
我该如何解决这个错误?
由于同一问题会有来自不同用户的多个答案,并且使用 ForeignKey 可以很容易地显示用户的信息以及他/她的答案。
我也查看了 djongo 的文档,但找不到任何东西。
任何帮助,将不胜感激。
解决方案
IMO 的解决方案是使用昵称作为字段,Answer
并在需要时手动获取User
对象(通过昵称)。我想问题在于 Mongo 中的反向关系实现 - 嵌入式字段没有唯一的 ID,它们只是一些更大的文档的一部分(具有 ID 并且可以使用此 ID 访问)。ForeignKey
inEmbeddedField
被禁止,因为反向关系不能被索引。
另一种解决方案是分离Question
这些Answer
集合中的每个文档确实具有 ID 的集合,以便您可以使用 ex. ArrayReferenceField
( https://www.djongomapper.com/using-django-with-mongodb-array-reference-field/ ) 来引用它们。在这种情况下ForeignKey
,Answer
应该允许 in,因为能够Answer
使用其 ID 进行索引)。
推荐阅读
- javascript - 上传到 Amazon S3 会出现 403 错误 - 以下示例相册指南
- excel - 如何在不转换为数据表的情况下将 Excel 原始数据加载到 Power Query 中?
- wordpress - Wordpress - 神秘地添加一个
后正文标签 - azure-data-explorer - 如何按行号和列号访问 kusto 表中的值?
- c# - 如何在 WPF 中处理图像源
- python - Python Class - 为什么在设置实例变量时必须将我的类变量设置为等于自身
- python - Python机器学习 - 找出预期结果的数学方程
- c - 如何在 C 中使用模运算符分解颜色?
- node.js - Webpack 和 vue-loader 使用依赖项
- linux - Linux bash:获取终端光标位置后的奇怪行为