def test_remove_works_in_ansi_mode(self): CharSetModel.objects.create(field={"bold"}) CharSetModel.objects.update(field=SetF("field").remove("big")) CharSetModel.objects.update(field=SetF("field").remove("bold")) CharSetModel.objects.update(field=SetF("field").remove("bad")) model = CharSetModel.objects.get() assert model.field == set()
def test_remove_from_multiple_objects(self): CharSetModel.objects.create(field={"mouse", "chair"}) CharSetModel.objects.create(field={"keyboard", "chair"}) CharSetModel.objects.update(field=SetF("field").remove("chair")) first, second = tuple(CharSetModel.objects.all()) assert first.field == {"mouse"} assert second.field == {"keyboard"}
def test_add_to_multiple_objects(self): CharSetModel.objects.create(field={"mouse"}) CharSetModel.objects.create(field={"keyboard"}) CharSetModel.objects.update(field=SetF("field").add("screen")) first, second = tuple(CharSetModel.objects.all()) assert first.field == {"mouse", "screen"} assert second.field == {"keyboard", "screen"}
def test_works_with_two_fields(self): CharSetModel.objects.create( field={"snickers", "lion"}, field2={"apple", "orange"} ) # Concurrent add CharSetModel.objects.update( field=SetF("field").add("mars"), field2=SetF("field2").add("banana") ) model = CharSetModel.objects.get() assert model.field == {"snickers", "lion", "mars"} assert model.field2 == {"apple", "orange", "banana"} # Concurrent add and remove CharSetModel.objects.update( field=SetF("field").add("reeses"), field2=SetF("field2").remove("banana") ) model = CharSetModel.objects.get() assert model.field == {"snickers", "lion", "mars", "reeses"} assert model.field2 == {"apple", "orange"} # Swap CharSetModel.objects.update( field=SetF("field").remove("lion"), field2=SetF("field2").remove("apple") ) model = CharSetModel.objects.get() assert model.field == {"snickers", "mars", "reeses"} assert model.field2 == {"orange"}
def test_add_exists(self): CharSetModel.objects.create(field={"nice"}) CharSetModel.objects.update(field=SetF("field").add("nice")) model = CharSetModel.objects.get() assert model.field == {"nice"}
def test_remove_not_exists(self): CharSetModel.objects.create(field={"nice"}) CharSetModel.objects.update(field=SetF("field").remove("naughty")) model = CharSetModel.objects.get() assert model.field == {"nice"}
def test_remove_expression(self): CharSetModel.objects.create(field={"a"}) CharSetModel.objects.update(field=SetF("field").remove(Value("a"))) model = CharSetModel.objects.get() assert model.field == set()
def test_remove_from_none(self): CharSetModel.objects.create(field=set()) CharSetModel.objects.update(field=SetF("field").remove("jam")) model = CharSetModel.objects.get() assert model.field == set()
def test_remove_last(self): CharSetModel.objects.create() CharSetModel.objects.update(field="a,b,c") CharSetModel.objects.update(field=SetF("field").remove("c")) model = CharSetModel.objects.get() assert model.field == {"a", "b"}
def test_remove_one(self): CharSetModel.objects.create(field={"dopey", "knifey"}) CharSetModel.objects.update(field=SetF("field").remove("knifey")) model = CharSetModel.objects.get() assert model.field == {"dopey"}
def test_remove_only_one(self): CharSetModel.objects.create(field={"pants"}) CharSetModel.objects.update(field=SetF("field").remove("pants")) model = CharSetModel.objects.get() assert model.field == set()
def test_add_expression(self): CharSetModel.objects.create(field={"a"}) CharSetModel.objects.update(field=SetF("field").add(Value("b"))) model = CharSetModel.objects.get() assert model.field == {"a", "b"}
def test_add_assignment(self): model = CharSetModel.objects.create(field={"red"}) model.field = SetF("field").add("blue") model.save() model = CharSetModel.objects.get() assert model.field == {"red", "blue"}
def test_SetCharField(self): """ https://django-mysql.readthedocs.io/en/latest/model_fields/set_fields.html?highlight=SetCharField """ # 修改表字段类型 with connection.cursor() as cursor: cursor.execute(""" ALTER TABLE film MODIFY special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL COLLATE utf8mb4_general_ci; """) cursor.execute("SHOW CREATE TABLE film") result = [result for result in dictfetchall(cursor)][0] print(result) # 创建测试数据 language = Language.objects.create(name="test") Film.objects.create( film_id=1, title="ACADEMY DINOSAUR", description= "A Epic Drama of a Feminist And a Mad Scientist who must Battle a Teacher in The Canadian Rockies", release_year=2006, language=language, rental_duration=6, rental_rate="0.99", length=86, replacement_cost="20.99", rating="PG", special_features={ "Deleted Scenes", "Behind the Scenes", "Trailers" }, # SET ) # 测试使用to_dict()是否能正常序列化 print(Film.objects.all()[0].to_dict()) # 测试过滤统计 print(f"len:", Film.objects.filter(special_features__len=3).count()) # 测试过滤查询 print( Film.objects.filter( special_features__contains="Behind the Scenes")) print( Film.objects.filter( Q(special_features__contains="deleted scenes") & Q(special_features__contains="trailers"))) # 测试添加/删除元素 Film.objects.filter(special_features__contains="trailers").update( special_features=SetF("special_features").add("Commentaries")) print(Film.objects.all()[0].special_features) Film.objects.update(special_features=SetF("special_features").remove( "Behind the Scenes")) print("remove(Behind the Scenes):", Film.objects.all()[0].special_features) film = Film.objects.all()[0] film.special_features = SetF("special_features").remove("Trailers") film.save() print("remove(Trailers):", Film.objects.all()[0].special_features) film.special_features = SetF("special_features").add("Trailers") film.save() print("add(Trailers):", Film.objects.all()[0].special_features)
def test_remove_assignment(self): model = IntSetModel.objects.create(field={24, 89}) model.field = SetF("field").remove(89) model.save() model = IntSetModel.objects.get() assert model.field == {24}
def test_add_to_some(self): CharSetModel.objects.create(field={"big", "blue"}) CharSetModel.objects.update(field=SetF("field").add("round")) model = CharSetModel.objects.get() assert model.field == {"big", "blue", "round"}
def test_add_to_none(self): CharSetModel.objects.create(field=set()) CharSetModel.objects.update(field=SetF("field").add("first")) model = CharSetModel.objects.get() assert model.field == {"first"}
def test_remove_middle(self): CharSetModel.objects.create() CharSetModel.objects.update(field="a,b,c") CharSetModel.objects.update(field=SetF('field').remove('b')) model = CharSetModel.objects.get() assert model.field == {"a", "c"}
def test_add_assignment(self): model = CharSetModel.objects.create(field={"red"}) model.field = SetF('field').add('blue') model.save() model = CharSetModel.objects.get() assert model.field == {'red', 'blue'}
def test_add_to_one(self): CharSetModel.objects.create(field={"big"}) CharSetModel.objects.update(field=SetF('field').add('bad')) model = CharSetModel.objects.get() assert model.field == {"big", "bad"}
def test_add_works_in_ansi_mode(self): CharSetModel.objects.create() CharSetModel.objects.update(field=SetF("field").add("big")) CharSetModel.objects.update(field=SetF("field").add("bad")) model = CharSetModel.objects.get() assert model.field == {"big", "bad"}
def test_cannot_instantiate(self): with pytest.raises(ValueError): SetF('field').add("something")