pytest django泛型关系旧对象出现
Pytest django generic relation old object appeared
我有一个模型:
class Product(models.Model):
url = models.TextField(blank=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Store(models.Model):
product = GenericRelation('Product')
以及为商店创建产品的 celery 任务:
def my_celery_task(store_obj_pk):
store_obj = Store.objects.get(pk=store_obj_pk)
Product.objects.create(
content_type=ContentType.objects.get_for_model(store_obj),
object_id=store_obj.pk,
)
我想用 pytest 测试这个任务
class TestStoreTask:
def test_store_one(self):
self.__test_store(store_product={
'name': 'one'
})
def test_store_two(self):
self.__test_store(store_product={
'name': 'two'
})
def __test_store(self, store_product):
store_obj = Store.objects.create()
my_celery_task(store_obj_pk=store_obj.pk)
print(store_obj.product.all())
所以我希望每次测试一个对象。但是当我 运行 在 test_store_two
中进行两个测试时,我有两个对象。这个对象有 id 2 和 3。
所以我对 test_store_one
的输出:
<QuerySet [<Product: Product object (1)>]>
对于test_store_two
:
<QuerySet [<Product: Product object (2)>, <Product: Product object (3)>]>
我不明白为什么id被改变了,为什么对象出现在新的测试用例中。
@hoefling 感谢您的帮助。这是非常奇怪的行为。所以在任务中创建对象,是另一个 class 的方法,例如:
class SomeManagerClass:
products = []
def generate_products(self):
self.products.append('one')
def create_products(self, store_obj):
for title in self.products:
Product.objects.create(
title=title,
content_type=ContentType.objects.get_for_model(store_obj),
object_id=store_obj.pk,
)
在任务中我使用了它:
def my_celery_task(store_obj_pk):
store_obj = Store.objects.get(pk=store_obj_pk)
manager = SomeManagerClass()
manager.generate_products()
manager.create_products(store_obj)
当我调用 my_celery_task
两次时,我得到了 3 个对象,而不是两个。因为 self.products
之前的结果保持有效。
我通过修改 generate_products
函数解决了这个问题,例如:
def generate_products(self):
self.products = []
self.products.append('one')
我有一个模型:
class Product(models.Model):
url = models.TextField(blank=True)
content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
object_id = models.PositiveIntegerField()
content_object = GenericForeignKey('content_type', 'object_id')
class Store(models.Model):
product = GenericRelation('Product')
以及为商店创建产品的 celery 任务:
def my_celery_task(store_obj_pk):
store_obj = Store.objects.get(pk=store_obj_pk)
Product.objects.create(
content_type=ContentType.objects.get_for_model(store_obj),
object_id=store_obj.pk,
)
我想用 pytest 测试这个任务
class TestStoreTask:
def test_store_one(self):
self.__test_store(store_product={
'name': 'one'
})
def test_store_two(self):
self.__test_store(store_product={
'name': 'two'
})
def __test_store(self, store_product):
store_obj = Store.objects.create()
my_celery_task(store_obj_pk=store_obj.pk)
print(store_obj.product.all())
所以我希望每次测试一个对象。但是当我 运行 在 test_store_two
中进行两个测试时,我有两个对象。这个对象有 id 2 和 3。
所以我对 test_store_one
的输出:
<QuerySet [<Product: Product object (1)>]>
对于test_store_two
:
<QuerySet [<Product: Product object (2)>, <Product: Product object (3)>]>
我不明白为什么id被改变了,为什么对象出现在新的测试用例中。
@hoefling 感谢您的帮助。这是非常奇怪的行为。所以在任务中创建对象,是另一个 class 的方法,例如:
class SomeManagerClass:
products = []
def generate_products(self):
self.products.append('one')
def create_products(self, store_obj):
for title in self.products:
Product.objects.create(
title=title,
content_type=ContentType.objects.get_for_model(store_obj),
object_id=store_obj.pk,
)
在任务中我使用了它:
def my_celery_task(store_obj_pk):
store_obj = Store.objects.get(pk=store_obj_pk)
manager = SomeManagerClass()
manager.generate_products()
manager.create_products(store_obj)
当我调用 my_celery_task
两次时,我得到了 3 个对象,而不是两个。因为 self.products
之前的结果保持有效。
我通过修改 generate_products
函数解决了这个问题,例如:
def generate_products(self):
self.products = []
self.products.append('one')