我已经在我的 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 个字段(价格和数量),但是当我尝试保存后,“个人资料”字段上方出现以下错误:
“选择一个有效的选项。该选项不是可用选项之一。”
我不明白我错在哪里。
预先感谢您的帮助!
问题是
ForeignKey
默认情况下将 _id
附加到属性名称。在上面的示例中,它尝试在“个人资料”上使用属性 user_id
,在“订单”上使用 profile_id
。
解决方案是将ForeignKey更新为:
profile = models.ForeignKey(Profile, db_column='profile', on_delete=models.CASCADE)
您更改
db_column
的内容可能取决于您如何在 mongodb 中设置模式,但我收到了同样的错误并将 db_column
指向正确的属性,为我修复了它。
天啊@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)
这将帮助您执行所有与外键相关的查询。
当我遇到错误时,我无法获取相应指南中的资源。我可以使用两个型号的代码来注册该型号,但如果验证失败:选择一个有效的选项。该选择不是可用的选择之一。
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)})