MongoDB 数据库。错误“选择一个有效的选项。该选项不是可用的选项之一。”

问题描述 投票:0回答:3

我已经在我的 Django 项目中安装了 MongoDB。因为这是我第一次使用 Mongo,所以我决定尝试它的工作原理,并创建了一个简单的程序来存储数据(在我的例子中是价格和数量)。 该项目名为“exchange”,它有 2 个文件夹:exchange 和 app。

这是“app”文件夹中的文件 models.py:

from django.db import models
from djongo.models.fields import ObjectIdField, Field
from django.contrib.auth.models import User

class Profile(models.Model):
    _id = ObjectIdField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)

class Order(models.Model):
    _id = ObjectIdField()
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE)
    datetime = models.DateTimeField(auto_now_add=True)
    price = models.FloatField()
    quantity = models.FloatField()
    #ips = models.Field(default=[])
    #subprofiles = models.Field(default={})

这是文件admin.py

from django.contrib import admin
from .models import *

admin.site.register(Profile)
admin.site.register(Order)

这就是我在exchange文件夹的settings.py文件中设置数据库的方法

DATABASES = {
    'default': {
        'ENGINE': 'djongo',
        'NAME': 'engine',
    }
}

因此,在进行迁移并创建超级用户之后,我运行服务器,进入“管理”部分而不是“配置文件”中的部分,并创建了一个配置文件,选择唯一可用的选项(我的超级用户)。 此时,我在订单部分创建了一个订单:所以我在“配置文件”字段中选择了唯一可用的选项(之前创建的配置文件),然后我填写了其他 2 个字段(价格和数量),但是当我尝试保存后,“个人资料”字段上方出现以下错误:

“选择一个有效的选项。该选项不是可用选项之一。”

我不明白我错在哪里。

预先感谢您的帮助!

django mongodb djongo
3个回答
3
投票

问题是

ForeignKey
默认情况下将
_id
附加到属性名称。在上面的示例中,它尝试在“个人资料”上使用属性
user_id
,在“订单”上使用
profile_id

解决方案是将ForeignKey更新为:

profile = models.ForeignKey(Profile, db_column='profile', on_delete=models.CASCADE)

您更改

db_column
的内容可能取决于您如何在 mongodb 中设置模式,但我收到了同样的错误并将
db_column
指向正确的属性,为我修复了它。


0
投票

天啊@Adam Berg,在过去的 4 个多小时里我一直在尝试解决这个问题。你的回答很快就解决了。非常感谢你,你的工作非常值得赞赏。

import datetime,os
from djongo import models

class test1(models.Model):
   name = models.CharField(max_length=100)


class Profile(models.Model):
   user = models.ForeignKey(test1, db_column='user',on_delete=models.CASCADE)
     

这将帮助您执行所有与外键相关的查询。


0
投票

当我遇到错误时,我无法获取相应指南中的资源。我可以使用两个型号的代码来注册该型号,但如果验证失败:选择一个有效的选项。该选择不是可用的选择之一。

from django.urls import reverse
from djongo import models
from etablissement.models import Etablissement

#model filiere
class Filiere(models.Model):
id = models.ObjectIdField()
code = models.CharField(max_length=50)
intitule = models.CharField(max_length=255)
etablissement = models.ForeignKey(Etablissement,
db_column='etablissement', on_delete=models.CASCADE)

class Meta:
    db_table = "filieres"

def __str__(self):
    return self.intitule

def get_absolute_url_edit(self):
    return reverse('filiere_update', kwargs={'id': str(self.id)})

def get_absolute_url_delete(self):
    return reverse('filiere_delete', kwargs={'id': str(self.id)})

def get_absolute_url_detail(self):
    return reverse('filiere_detail', kwargs={'id': str(self.id)})


#model  pour établissement
from djongo import models
from django.urls import reverse

class Etablissement(models.Model):
id = models.ObjectIdField()
nom = models.CharField(max_length=100)
type = models.CharField(max_length=50)

class Meta:
    db_table = "etablissements"

def __str__(self):
    return self.nom

def get_absolute_url_edit(self):
    return reverse('etablissement_update', kwargs={'id': str(self.id)})

def get_absolute_url_delete(self):
    return reverse('etablissement_delete', kwargs={'id': str(self.id)})

def get_absolute_url_detail(self):
    return reverse('etablissement_detail', kwargs={'id': str(self.id)})
© www.soinside.com 2019 - 2024. All rights reserved.