MongoDB EmbeddedField 中的 Django Foreignkey

Posted

技术标签:

【中文标题】MongoDB EmbeddedField 中的 Django Foreignkey【英文标题】:Django Foreignkey in MongoDB's EmbeddedField 【发布时间】:2020-12-09 04:32:32 【问题描述】:

我在我的 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

我想在Questions 表中嵌入Answers。 但是我收到了这个错误

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\'>"']

我知道这个错误是因为我在 Answers 中使用了 User = models.ForeignKey(UserDetailTable,on_delete=models.CASCADE),它本身就是 Questions 上的 EmbeddedField。

我该如何解决这个错误?

由于同一问题会有来自不同用户的多个答案,并且使用 ForeignKey 可以很容易地显示用户的信息以及他/她的答案。

我也查看了 djongo 的文档,但找不到任何东西。

任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

IMO 的解决方案是在 Answer 中使用昵称作为字段,并在需要时手动获取 User 对象(通过昵称)。我想问题在于 Mongo 中的反向关系实现 - 嵌入式字段没有唯一的 ID,它们只是一些更大文档的一部分(具有 ID 并且可以使用此 ID 访问)。 ForeignKey in EmbeddedField 被禁止,因为反向关系不能被索引。

另一种解决方案是将QuestionAnswer 集合分开,这些集合中的每个文档都具有ID,这样您就可以使用ex。 ArrayReferenceField (https://www.djongomapper.com/using-django-with-mongodb-array-reference-field/) 来引用它们。在这种情况下,Answer 中的 ForeignKey 应该被允许,因为能够使用其 ID 索引 Answer

【讨论】:

以上是关于MongoDB EmbeddedField 中的 Django Foreignkey的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Pentaho 中的 mongodb 删除步骤删除 mongodb 集合中的文档

MongoDB中的索引操作总结

Node.JS + MongoDB聚合从MongoDB中的DataBase中查找数组中的数组

MongoDB基础命令及操作

mongodb怎么查询数组中的值

如何实现mongodb中的sum汇总操作?