小编Saš*_*aba的帖子

如何在 factory-boy 中使用 create_batch 时为属性设置序列?

在 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 testing django pytest factory-boy

5
推荐指数
1
解决办法
2561
查看次数

在Python单元测试中是否存在子列表的断言?

对于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)

python python-2.7 python-unittest

4
推荐指数
2
解决办法
1565
查看次数

列出 tox.ini 文件中的继承?

我有一个 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)

python inheritance ini tox

4
推荐指数
1
解决办法
789
查看次数

如何在 Django 1.7 的表单模型中获取当前登录的用户 ID?

假设我有一个显示歌曲的网页。假设有公共歌曲和私人歌曲。公开歌曲是所有人都可以看到的,而私人歌曲是某个用户自己创建的、只有他自己可以看到的歌曲。所以用户应该只看到那些具有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)

python django

3
推荐指数
1
解决办法
4552
查看次数

如何在 Django 表单中编辑选择选项值?

我想在我的 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(与变体相关)。 …

python django

2
推荐指数
1
解决办法
8870
查看次数

如何在模拟对同一方法的多个调用时断言调用顺序和参数?

我有多次调用同一个模拟器,我想检查每个调用参数和调用它的顺序.

例如,如果我需要检查最后一个电话,我会使用这个:

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)

python unit-testing mocking

2
推荐指数
1
解决办法
1595
查看次数

从Django查询集中仅获取特定属性的更好方法?

我有一个名为Songs的模型,其属性之一是'title'

假设我要获取存储在数据库中的所有歌曲名称的列表。

我可以做:

titles = []

for song in Song.objects.all():
    titles.append(song.title)
Run Code Online (Sandbox Code Playgroud)

有没有更简单的方法可以做到这一点?

python django

1
推荐指数
2
解决办法
2512
查看次数

HTTP 状态代码。空参数的最佳状态代码是什么?

我正在 Django Rest Framework 中编写一个 API。

我有一个密码重置端点,它接受一个“电子邮件”参数。如果标头中有一个键“email”,但该值是空字符串怎么办?

key: 'email'    
value: ''
Run Code Online (Sandbox Code Playgroud)

我应该返回什么状态代码?400,或者204?

编辑:我忘了提及这不应该是验证失败。该端点不需要授权。这仅用于发送密码重置电子邮件。

api-design http django-rest-framework

1
推荐指数
1
解决办法
4526
查看次数

如何从ValidationError访问错误消息?

在我的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)

python django

0
推荐指数
1
解决办法
210
查看次数

无法从 Django 的 QueryDict 中提取列表?

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 django

0
推荐指数
1
解决办法
884
查看次数