MongoDB的EmbeddedField中的Django Foreignkey

2024-10-01 09:26:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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上的一个嵌入字段

如何解决此错误

由于同一个问题将有来自不同用户的多个答案,使用ForeignKey可以很简单地显示用户的信息以及他/她的答案

我也看过djongo的医生,但什么也没找到

任何帮助都将不胜感激


Tags: pytrueapponmodels错误tabledelete
1条回答
网友
1楼 · 发布于 2024-10-01 09:26:10

在我看来,解决方案是在Answer中使用昵称作为字段,并在需要时手动获取User对象(通过昵称)。我认为问题在于Mongo中的反向关系实现——嵌入式字段没有唯一的ID,它们只是某个更大文档的一部分(有ID,可以使用此ID访问)EmbeddedField中的{}被禁止,因为反向关系无法被索引

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

相关问题 更多 >