Я пытаюсь добавить существующий или новый элемент из модели MenuItem в модель ItemCategory, которые связаны с помощью поля ManyToMany. Если объект MenuItem не существует в базе данных, он работает хорошо, но существующий MenuItem не может быть добавлен, он говорит, что что-то вроде menu_item уже существует.
Просмотр
class ItemCategoryView(generics.RetrieveUpdateDestroyAPIView):
"""Update, Edit or delete ItemCategory objects"""
serializer_class = ItemCategorySerializer
queryset = ItemCategory.objects.all()
lookup_field = 'id'
def get(self, request, id=None):
return self.retrieve(request)
def put(self, request, id=None):
return self.update(request, id)
def delete(self, request, id):
return self.destroy(request, id)
Сериализатор
class ItemCategorySerializer(serializers.ModelSerializer):
"""Serializer for ItemCategory objects"""
item = MenuItemSerializer(many=True, required=False)
class Meta:
model = ItemCategory
fields = ('id', 'name', 'item')
read_only_fields = ('id', )
# Creating with nested serializer
def create(self, validated_data):
menu_item = validated_data.pop('item', None)
category = ItemCategory.objects.create(**validated_data)
# if list of menu item info is passed
if menu_item:
items = []
for item in menu_item:
itm = MenuItem.objects.create(**item)
items.append(itm)
category.item.add(*items)
return category
def update(self, instance, validated_data):
"""Works perfectly in case if item doesn't exists"""
new_items = validated_data.pop('item')
items_to_be_added_to_category = []
for new_item in new_items:
try:
item_obj = MenuItem.objects.get(**new_item)
except MenuItem.DoesNotExist:
item_obj = MenuItem.objects.create(**new_item)
items_to_be_added_to_category.append(item_obj)
instance.item.add(*items_to_be_added_to_category)
instance.save()
return instance
Failed TestCase
def test_add_existing_item_to_category(self):
"""Test adding existing item object to category"""
category_obj = sample_category("Mutton Special")
item_obj, item_obj_info = sample_item(
item_name="Mutton Sekuwa",
payload_only=False
)
payload = {
"name": category_obj.name,
"item": [item_obj_info]
}
res = self.client.patch(
reverse(UPDATE_ITEM_CATEGORY_URL, kwargs={'id': category_obj.id}),
payload,
format="json"
)
category_obj = ItemCategory.objects.get(id=category_obj.id)
category_item = category_obj.item.all()
serializer = ItemCategorySerializer(category_obj)
self.assertEqual(res.data, serializer.data)
self.assertIn(item_obj, category_item)
self.assertEqual(res.status_code, status.HTTP_200_OK)
Ошибка:
======================================================================
FAIL: test_add_existing_item_to_category (Menu.tests.test_category_api.ItemCategoryAPITest)
Test adding existing item object to category
----------------------------------------------------------------------
Traceback (most recent call last):
File "/rms/Menu/tests/test_category_api.py", line 117, in test_add_existing_item_to_category
self.assertEqual(res.data, serializer.data)
AssertionError: {'item': [{'item_name': [ErrorDetail(string=[62 chars])]}]} != {'id': 2, 'name': 'Mutton Special', 'item':
[]}