【问题标题】:Receiving "Select a valid choice. That choice is not one of the available choices." while using Djongo ForeignKey with Django收到“选择一个有效的选择。该选择不是可用的选择之一。”在 Django 中使用 Djongo ForeignKey
【发布时间】:2021-08-13 09:34:06
【问题描述】:

在使用 djongo.models 中的 ForeignKey 时,我在 Django Admin 中遇到了这个奇怪的错误。 不确定我在模型文件中是否做错了什么。 Error Message Image

机器/models.py

from djongo import models


class Machine(models.Model):
    _id = models.ObjectIdField(primary_key=True)
    machine_type = models.TextField(null=False)
    machine_description = models.TextField(null=False)

    def __str__(self):
        return self.machine_type


# Create your models here.
class Errorcode(models.Model):
    _id = models.ObjectIdField(primary_key=True)
    code_name = models.TextField(null=False)
    machine_type = models.ForeignKey('Machine', on_delete=models.CASCADE)
    description = models.TextField(null=False)
    instruction = models.TextField(null=False)

    def __str__(self):
        return self.code_name


class AdditionalFile(models.Model):
    error_code = models.ForeignKey('Errorcode', on_delete=models.CASCADE)
    file_name = models.TextField(blank=True)
    file_path = models.FileField(blank=True, upload_to='static/asset')

    def __str__(self):
        return self.file_name

如果需要任何其他文件来检查问题,我可以在此处添加代码。

【问题讨论】:

  • 告诉您的选择与您的模型选择不匹配的错误。您的选择可能与您的模型选择不匹配。
  • @boyenec 我想我选择了正确的模型,在这种情况下,django admin 列出了我的 mongoDB 中的所有 Machine 模型以供选择,但是,管理员不允许我使用我选择的模型外键

标签: python django djongo


【解决方案1】:

好的,所以我以某种方式找到了解决此问题的解决方法。 问题是Django自带的ForeignKey,djongo没有覆盖ForeignKey来适配mongoDB的ObjectID,这让Django混淆了使用ObjectID作为PK。

所以解决方法就是更新 id 并使用 IntegerField 作为 PK

class Machine(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    machine_type = models.TextField(null=False)
    machine_description = models.TextField(null=False)

    object = models.DjongoManager()

    def __str__(self):
        return self.machine_type


# Create your models here.
class Errorcode(models.Model):
    id = models.IntegerField(primary_key=True, unique=True)
    code_name = models.TextField(null=False)
    machine_type = models.ForeignKey(to=Machine, to_field='id', on_delete=models.CASCADE)
    description = models.TextField(null=False)
    instruction = models.TextField(null=False)

    object = models.DjongoManager()

    def __str__(self):
        return self.code_name
.
.
.

【讨论】:

  • 也许不使用 djongo 而使用 PyMongo 是另一种选择。
猜你喜欢
  • 2018-06-11
  • 2021-04-12
  • 2017-12-30
  • 1970-01-01
  • 2014-06-24
  • 2016-05-18
  • 1970-01-01
  • 2020-10-30
  • 2012-01-22
相关资源
最近更新 更多