小编lmr*_*391的帖子

使用 Protocol 和 TypeVar 指定任意数据类的 Python 类型提示

我正在编写一个可以在内存中存储任意数据类的类。在那里,我试图指定要存储的实例必须是数据类并且具有字段id。此外,还应该可以通过指定实例的类和 id 来获取实例。

我正在努力定义正确的类型提示。TypeVar我已经想通了,我(可能)需要和的组合Protocol。这是我当前的代码:

import typing
import uuid
from collections import defaultdict
from dataclasses import field, dataclass


class DataclassWithId(typing.Protocol):
    __dataclass_fields__: typing.Dict
    id: str


Klass = typing.TypeVar("Klass", bound=DataclassWithId)


class InMemoryDataClassStore:
    def __init__(self):
        self._data_store = defaultdict(lambda: dict())

    def add(self, instance: Klass):
        store_for_class = self._get_store_for_class(instance.__class__)
        store_for_class[instance.id] = instance

    def get(self, klass: typing.Type[Klass], id_: str) -> Klass:
        return self._get_store_for_class(klass)[id_]

    def get_all(self, klass) -> typing.List[Klass]:
        return list(self._get_store_for_class(klass).values())

    def _get_store_for_class(
        self, klass: typing.Type[Klass]
    ) -> typing.Dict[str, Klass]:
        return self._data_store[klass]


auto_uuid_field …
Run Code Online (Sandbox Code Playgroud)

python typing type-hinting mypy

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

Django loaddata 具有自然键和与自身的多对多关系

ManyToManyField我有一个带有to的模型"self"。现在我想将数据从本地复制到生产环境。为了做到这一点,我想将数据库中的所有条目转储到固定装置并将其加载到生产服务器上。因为该服务器已经包含数据,所以我使用自然键导出它们。导出运行良好,但loaddata如果一个实例引用与夹具中该实例下方定义的同一模型的另一个实例的关系,则会出现错误。

让我困惑的是:如果我不使用自然键,一切都会顺利。但这与生产中已有的数据相冲突。

请考虑以下示例:

from django.db import models


class PersonManager(models.Manager):
    def get_by_natural_key(self, name):
        return self.get(name=name)


class Person(models.Model):
    objects = PersonManager()

    name = models.CharField(max_length=150, unique=True)
    friends = models.ManyToManyField("self", blank=True)

    def natural_key(self):
        return self.name,
Run Code Online (Sandbox Code Playgroud)

重现:

>>> python manage.py shell
>>> from relations.models import *
>>> person1 = Person.objects.create(name='foo')
>>> person2 = Person.objects.create(name='bar')
>>> person3 = Person.objects.create(name='baz')
>>> person2.friends.add(person2)
>>> person2.save()
>>> exit()
>>>
>>> python manage.py dumpdata relations.Person --natural-primary --natural-foreign > relations/fixtures/people.json

# change the database url to …
Run Code Online (Sandbox Code Playgroud)

python django

5
推荐指数
0
解决办法
806
查看次数

使用pytest-django对现有数据库运行测试

有人知道如何针对现有(例如生产)数据库使用pytest-django运行Django测试吗?
我知道通常这不是单元测试应该做的,但就我而言,我是在Heroku上运行测试。默认情况下,Django创建一个新的测试数据库,但是,这在Heroku上是不可能的。

我找到了一个无需pytest-django(python manage.py test)即可使用的解决方案:https : //gist.github.com/gregsadetsky/5018173,
但据我了解,pytest-django并未利用Django中定义的测试运行器设置。

如果有人对在Heroku上使用pytest-django运行Django测试的另一种方法(例如,通过自动创建测试数据库的方式),我也对该解决方案感到满意。

python django postgresql heroku pytest

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

标签 统计

python ×3

django ×2

heroku ×1

mypy ×1

postgresql ×1

pytest ×1

type-hinting ×1

typing ×1