需要保持包的大小,那么是否可以以某种受支持的格式压缩初始数据以供syncdb拾取?
运行“python manage.py test”后出现奇怪的错误
django.db.utils.OperationalError: Problem installing fixture
'/home/voxa/django/test_test/resume/fixtures/initial_data.json': Could not load
resume.Person(pk=1): no such table: resume_person
Run Code Online (Sandbox Code Playgroud)
但是我使用了与“python manage.py loaddata initial_data.json”相同的装置
更新:
测试.py
from django.test import TestCase
from django.test import Client
from resume.models import Person
class ResumeTest(TestCase):
def test_model(self):
bio = Person(first_name="Homer", last_name="Simpson", birth_date="04.02.1978", email="mail@gmail.com", jabber="jabber@jabbim.com", skype="skype", other_contacts="tel: +380975322155", bio="Was born...")
def test_index(self):
client = Client()
response = client.get('/')
self.assertEqual(response.status_code, 200)
self.assertContains(response, "Volodymyr")
Run Code Online (Sandbox Code Playgroud) 我有两个实体,即“用户”和“地址”,其中它们之间具有“ OneToOne ”关系。
用户表有一列' address_id ',它是外键,存储地址表的id 。我尝试使用两种不同的方法创建夹具:
方法一:
地址夹具.php
namespace App\DataFixtures;
use App\Entity\Address;
use App\Entity\User;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
class AddressFixture extends Fixture
{
public function __construct(UserPasswordEncoderInterface $encoder)
{
$this->encoder = $encoder;
}
public function load(ObjectManager $manager)
{
$address = new Address();
$address->setStreet('Sai Apartment');
$address->setCity('Noida');
$address->setState('Uttar Pradesh');
$address->setCountry('India');
$address->setPincode('201301');
$manager->persist($address);
$manager->flush();
if (null != $address->getId()) {
$user = new User();
$user->setFName('Kumar');
$user->setLName('Saurabh');
$user->setUsername('supa-admin');
$user->setPassword(
$this->encoder->encodePassword($user, 'querty')
);
$user->setEmail('some_email@gmail.com');
$user->setAddress($address);
$user->setContact(78954); …Run Code Online (Sandbox Code Playgroud) 如果我有一个 Django 模型,定义了一些字段:
# model.py
from django.db import models
class Model(models.Model):
text = models.CharField(max_length=10)
Run Code Online (Sandbox Code Playgroud)
我可以使用夹具对其进行初始化:
# sample.yaml
- model: app.Model
pk: 1
fields:
text: "some text"
Run Code Online (Sandbox Code Playgroud)
使用命令: manage.py loaddata sample.yaml一切正常。
我的问题是我不能对没有字段的模型做同样的事情:
# model.py
from django.db import models
class Model(models.Model):
pass
Run Code Online (Sandbox Code Playgroud)
# sample.yaml
- model: app.Model
pk: 1
fields:
Run Code Online (Sandbox Code Playgroud)
然后相同的manage.py loaddata sample.yaml命令给出错误:
Run Code Online (Sandbox Code Playgroud)Traceback (most recent call last): File "/usr/local/lib/python3.8/site-packages/django/core/serializers/pyyaml.py", line 73, in Deserializer yield from PythonDeserializer(yaml.load(stream, Loader=SafeLoader), **options) File "/usr/local/lib/python3.8/site-packages/django/core/serializers/python.py", line 112, in Deserializer for (field_name, field_value) …
initial_data.json当Django 位于项目目录中但没有位于Django搜索灯具的三个指定位置之一时,会自动加载灯具?FIXTURE_DIRS在settings.py中设置设置Django的django-admin.py和manage.py文档中的什么是"Fixture"部分说明:
Django将在三个地点搜索固定装置:
- 在每个已安装的应用程序的fixtures目录中
- 在FIXTURE_DIRS设置中指定的任何目录中
- 在夹具命名的文字路径中
Django将加载它在这些位置匹配提供的灯具名称的任何和所有灯具.
我有一个Django项目,我想将测试数据添加到数据库.当我像这样制作syncdb时
python ~/django/foo/manage.py syncdb
Run Code Online (Sandbox Code Playgroud)
安装表后我遇到了错误
Problem installing fixture '~/django/foo/shop/fixtures/initial_data.json':
Traceback (most recent call last):
raise JSONDecodeError("No JSON object could be decoded", s, idx)
JSONDecodeError: No JSON object could be decoded: line 1 column 0 (char 0)
Run Code Online (Sandbox Code Playgroud)
我的模特在这里:
# -*- coding: utf-8 -*-
from django.db import models
class Image(models.Model):
file = models.ImageField(upload_to = "img/")
title = models.CharField(
max_length=128,
blank = True
)
slug = models.SlugField(max_length=128, blank = True)
def __unicode__(self):
return unicode(self.title)
Run Code Online (Sandbox Code Playgroud)
我的夹具是这样的:
[
{
"pk": 2,
"model": "shop.image",
"fields": { …Run Code Online (Sandbox Code Playgroud) 我有一个django项目,结构如下:
/djninja # project dir
/djninja # main app dir
/bands # app dir
/fans # app dir
/lyrics # app dir
Run Code Online (Sandbox Code Playgroud)
我创建了一个initial_data.yaml文件来制作syncdb加载夹具(我更喜欢YAML格式).根据文档,我将把它放在任何app fixtures子目录中.所以我做了,我有:
/djninja
/djninja
/bands
/fixtures
- initial_data.yaml
/fans
/lyrics
Run Code Online (Sandbox Code Playgroud)
但是syncdb省略了该文件.然后我将它移动到主项目目录中:
/djninja
/djninja
/fixtures
- initial_data.yaml
/bands
/fans
/lyrics
Run Code Online (Sandbox Code Playgroud)
它仍被忽略.我想在syncdb命令中加载灯具我做错了什么?
我知道可以像initial_data.json我自己的模型一样创建灯具文件.我想为导入的django-allauth应用程序创建和使用的表创建类似的文件.
我试过了:
[
{
"model":"allauth.socialaccount.models.SocialApp",
"pk":1,
"fields":{
"id":"1",
"provider":"facebook",
"name":"facebook",
"client_id":"0011223344556677",
"key":"",
"secret":"012345678901234567890123456"
}
}
]
Run Code Online (Sandbox Code Playgroud)
然而,最终会出现错误:
python manage.py syncdb
Creating tables ...
Installing custom SQL ...
Installing indexes ...
DeserializationError: Problem installing fixture 'initial_data.json':
Invalid model identifier: 'allauth.socialaccount.models.SocialApp'
Run Code Online (Sandbox Code Playgroud) 我正在尝试用Django进行测试驱动开发.我的问题是我需要在运行测试之前在数据库中添加一些东西,例如许多用户,部门和他们的权限.我尝试使用fixture来做到这一点,但我发现整个过程非常不直观(我也发现当我删除并重新同步我的数据库时,我的用户设备被破坏,因为权限仅通过id引用)!
我已经搜索了这个预测试数据库初始化的其他解决方案,但我只能找到在TestCase类的setUp方法中执行初始化的非常简单的情况.当你有一个具有不同用户和权限的应用程序需要测试时,我真的不能使用这些方法.
在开始大型应用程序的测试之前,您能告诉我如何填充数据库吗?除了fixtures和setUp类之外还有更好的方法吗?
我通过简单的集成测试看到了这个错误.django应用程序storageadmin使用一个名为Disk自定义模型方法的模型调用pool_name.我使用的南亚和Django的REST框架,并有SOUTH_TESTS_MIGRATE = False在settings.py
使用此命令创建夹具.在dumpdata之前,应用程序会使用一些模型填充默认数据库,这足以进行测试.
./bin/django dumpdata storageadmin oauth2_provider auth.User --indent=2 > src/rockstor /storageadmin/fixtures/storageadmin.json
该错误涉及以下模型
class Disk(models.Model):
pool = models.ForeignKey(Pool, null=True, on_delete=models.SET_NULL)
name = models.CharField(max_length=10, unique=True)
def pool_name(self, *args, **kwargs):
try:
return self.pool.name
except:
return None
class Meta:
app_label = 'storageadmin'
Run Code Online (Sandbox Code Playgroud)
有一个序列化器,在视图中用于发送响应
class DiskInfoSerializer(serializers.ModelSerializer):
pool_name = serializers.CharField(source='pool_name')
class Meta:
model = Disk
Run Code Online (Sandbox Code Playgroud)
View返回类似的响应
ds = DiskInfoSerializer(Disk.objects.all())
return Response(ds.data)
Run Code Online (Sandbox Code Playgroud)
编辑:如正确答案所示,问题出在上述观点中.我使用的是非常旧的DRF(2.1.15),但目前正在测试的版本(2.4.3)需要 ds = DiskInfoSerializer(Disk.objects.all(), many=True)
触发错误的简单测试用例是:
class DiskTests(APITestCase):
fixtures = ['storageadmin.json']
BASE_URL = '/api/disks/scan' …Run Code Online (Sandbox Code Playgroud) 我正在使用django-guardian为Django项目编写测试。权限的夹具如下所示:
- fields:
content_type: 10
object_pk: '2'
permission: 22
user: 1
model: guardian.userobjectpermission
pk: 1
Run Code Online (Sandbox Code Playgroud)
它是安全的基准content_type,并permission通过ID?还是ID会改变(即当我添加额外的权限/模型时)?
引用自动加载的对象的最佳方法是什么?
因此,我查看了文档以及这个SO问题以及django-seed软件包,但是这些似乎都不适合我想要的工作。
基本上,我想以编程方式Games从外部API 播种模型,但是我能找到的所有信息似乎都依赖于首先生成固定装置,这似乎是不必要的步骤。
例如,在Ruby / Rails中,您可以根据需要直接以seed.rb任何方式直接写入数据库并为数据库设置种子。
如果Django提供了类似的功能,还是我需要先从API生成固定装置,然后将其导入?
django-fixtures ×12
django ×11
python ×5
unit-testing ×2
compression ×1
django-admin ×1
doctrine ×1
json ×1
orm ×1
symfony ×1
symfony-4.2 ×1
testing ×1
yaml ×1