在 Django 中使用 factory_boy 时,我该如何实现?
模型.py
class TestModel(models.Model):
name = CharField()
order = IntegerField()
Run Code Online (Sandbox Code Playgroud)
食谱.py
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title())
order = 0
Run Code Online (Sandbox Code Playgroud)
测试.py
recipes.TestModelFactory.create_batch(4, order=+10)
Run Code Online (Sandbox Code Playgroud)
或者
recipes.TestModelFactory.create_batch(4, order=seq(10))
Run Code Online (Sandbox Code Playgroud)
或类似的东西,以达到这个结果:
TestModel.objects.all().values_list('order', flat=True)
[10, 20, 30, 40]
Run Code Online (Sandbox Code Playgroud)
更新
Ty @trinchet 的想法。所以我想一种解决方案是:
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title())
order = factory.Sequence(lambda n: n * 10)
Run Code Online (Sandbox Code Playgroud)
但这总是会在我的所有对象上设置序列,而我无法设置我想要的值。
一种解决方法是:
class TestModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = TestModel
name = factory.LazyAttribute(lambda o: faker.word().title()) …Run Code Online (Sandbox Code Playgroud) 对于Python 2.7:
list1 = [1, 2]
self.assertIn(1, list1)
self.assertIn(2, list1)
Run Code Online (Sandbox Code Playgroud)
有没有办法让我更轻松?就像是:
self.assertIn((1,2), list1) # I know this is wrong, just an example
Run Code Online (Sandbox Code Playgroud) 我有一个 tox.ini 文件,如下所示:
[testenv]
usedevelop=True
commands =
py.test --quiet {posargs}
deps =
requests
pytest
pytest-cov
pytest-env
oauthlib
PyJWT
python-dateutil
pydispatcher
isodate
[testenv:py27]
deps =
mock
requests
pytest
pytest-cov
pytest-env
oauthlib
PyJWT
python-dateutil
pydispatcher
isodate
[testenv:py33]
basepython = /opt/python3.3/bin/python3.3
Run Code Online (Sandbox Code Playgroud)
其中 py27 和 py33 都继承自 main[testenv]部分。有没有一种方法可以让我不必在继承上指定整个列表,而只需附加,也许是这样的:
deps += mock
Run Code Online (Sandbox Code Playgroud) 假设我有一个显示歌曲的网页。假设有公共歌曲和私人歌曲。公开歌曲是所有人都可以看到的,而私人歌曲是某个用户自己创建的、只有他自己可以看到的歌曲。所以用户应该只看到那些具有owner_id == NULL和owner_id == current_logged_in_user_id(他自己的id)的歌曲
模型:
import ....
class Song(models.Model):
name = models.CharField(max_length=100)
duration = models.IntegerField(max_length=15)
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True)
def __unicode__(self):
return self.name
Run Code Online (Sandbox Code Playgroud)
看法:
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required
from songapp.models import Song
from songapp.forms import SongInfoForm
@login_required
def song_info(request):
song = get_object_or_404(Box)
song_status = song.get_status()
form = SongInfoForm(initial={'song_list': song.song_list})
return render(request, 'songapp/song_info.html',
{'form': form, 'song': song, 'song_status': song_status})
Run Code Online (Sandbox Code Playgroud)
形式:
from django import forms
from django.forms import ModelChoiceField
from songapp.models import Song
class …Run Code Online (Sandbox Code Playgroud) 我想在我的 Django 表单中编辑选择选项值。现在 select 中 option 的值是相关的 variant_id。
模型.py
class ReceiptDetail(models.Model):
variant = models.ForeignKey('ProductVariant')
Run Code Online (Sandbox Code Playgroud)
表格.py
class ReceiptDetailForm(forms.ModelForm)
class Meta:
model = ReceiptDetail
fields = ['product_id', 'variant', 'size', 'quantity', 'price']
Run Code Online (Sandbox Code Playgroud)
从“变体”上选择生成的 html:
<option value="" selected="selected">---------</option>
<option value="98">Charm I (Charm I)</option>
<option value="97">Small potion V (Small potion V)</option>
<option value="90">Big potion V (Big potion V)</option>
<option value="100">Charm III (Charm III)</option>
<option value="93">Small potion I (Small potion I)</option>
<option value="94">Small potion II (Small potion II)</option>
<option value="81">Colorfully (Colorfully)</option>
Run Code Online (Sandbox Code Playgroud)
请注意,每个选项的值都是 VARIANT id。我想将该值更改为 PRODUCT id(与变体相关)。 …
我有多次调用同一个模拟器,我想检查每个调用参数和调用它的顺序.
例如,如果我需要检查最后一个电话,我会使用这个:
mock.assert_called_once_with(
'GET',
'https://www.foobar.com',
params=OrderedDict([
('email', 'email'),
]),
headers=None,
data=None)
Run Code Online (Sandbox Code Playgroud)
但是我想为每次通话都这样做.
我设法做到了,像这样:
mycode.py
from requests import Session
class Foo(object):
def req(method, url, data, params=None, headers=None):
self.session = Session()
r = self.session.request(method, url, data=data, params=params, headers=headers)
return r
Run Code Online (Sandbox Code Playgroud)
test_mycode.py
@patch('myapp.mycode.Session')
def test_foobar(self, Session):
# Set mock.
self.request_mock = Session.return_value.request
self.request_mock.return_value = MagicMock()
data = {'foo': 'bar'}
f = Foo()
f.req('POST', 'https://www.foobar.com/', data=data)
f.req('GET', 'https://www.foobar.com/', data=None)
self.assertEqual(self.request_mock.call_count, 2)
call1 = self.request_mock._mock_call_args_list[0]
call2 = self.request_mock._mock_call_args_list[1]
call_params = (
('POST', 'https://www.foobar.com'),
{
'headers': …Run Code Online (Sandbox Code Playgroud) 我有一个名为Songs的模型,其属性之一是'title'。
假设我要获取存储在数据库中的所有歌曲名称的列表。
我可以做:
titles = []
for song in Song.objects.all():
titles.append(song.title)
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法可以做到这一点?
我正在 Django Rest Framework 中编写一个 API。
我有一个密码重置端点,它接受一个“电子邮件”参数。如果标头中有一个键“email”,但该值是空字符串怎么办?
key: 'email'
value: ''
Run Code Online (Sandbox Code Playgroud)
我应该返回什么状态代码?400,或者204?
编辑:我忘了提及这不应该是验证失败。该端点不需要授权。这仅用于发送密码重置电子邮件。
在我的test.py中,我有:
with self.assertRaises(ValidationError):
validate_zipfile(test_zip_path + '.zip')
Run Code Online (Sandbox Code Playgroud)
这按预期工作。我还想访问此ValidationError引发的错误消息,所以我可以这样做:
self.assertEqual(#error that I extract from the code above, 'Zip file not in correct format.')
Run Code Online (Sandbox Code Playgroud) Django 1.7 Python 2.7
我有一个 QueryDict 对象(让我们命名它qd):
<QueryDict: {u'org': [u''], u'songs': [u'1', u'2'], u'user': [u'222'], u'name': [u'test_name']}>
Run Code Online (Sandbox Code Playgroud)
但我似乎无法获得“歌曲”的价值。
我试过了:
qd.get('songs')
qd['songs']
qd.__getitem__('songs')
Run Code Online (Sandbox Code Playgroud)
但他们都回来了u'2'。
为什么我不能得到一个列表,看起来很琐碎?
python ×9
django ×6
api-design ×1
factory-boy ×1
http ×1
inheritance ×1
ini ×1
mocking ×1
pytest ×1
python-2.7 ×1
testing ×1
tox ×1
unit-testing ×1