django.db.utils.Ошибка целостности: НЕ выполнено ограничение NULL: rango_category.super_cat_id

#django #unit-testing #django-models

Вопрос:

 /*tests.py*/
def create_user(username, password):
user = get_user_model().objects.create_user(username=username, password=password)
return user

#helper function to populat database 
def create_category(name, super, user):
category = Category.objects.get_or_create(name=name)[0]
category.super = super
category.user = user
category.save()
return category

# The following test is for the save and deleting of
# a page from the favorites list
class TestFavoritesFeature(TestCase):
def setUp(self):
    self.user = create_user("testUser", "testPassword")
    self.cat = create_category('python', self.super, self.user)
 

Как object.create, так и object.get_or_create выдают ошибку для поля NOT NULL. Выше приведен код , 2 модели, и обе выдают ошибку только в поле идентификатора, которое мы даже не заполняем. Задача функции состоит в том, чтобы присвоить ей уникальный идентификатор. Выше приведен код из tests.py файл. Я пытаюсь заполнить базу данных для модульного тестирования . В реальном коде эти объекты.get_or_create или objects.create не выдают ошибок, но довольно успешны

Комментарии:

1. разве вы не должны использовать self.client.get(...,{'page_id': self.page.id}) это с page_id over id ?

Ответ №1:

В .get_or_create(…) [Django-doc] вам нужно указать значения для super_cat , user и name , но вы сделали это только для имени.

Мы можем еще больше упростить метод, используя .update_or_create(…) [Django-doc] и используя defaults=… параметр, чтобы указать, что следует обновлять или инициализировать в случае, если объект не создан/не создан:

 def create_category(name, super, user):
    category, __ = Category.objects.update_or_create(
        name=name,
        defaults={'super_cat': super, 'user': user}
    )
    return category 

Комментарии:

1. Да, спасибо, это работает. Теперь у меня есть ManyToManyField, он не позволяет мне передавать значения по умолчанию в качестве пары значений ключа. как мне продолжать добавлять его ?

2. @NikhitaSareen: вам нужно будет обновить это в строках после category, __ = ... и return category . Там вы можете использовать category.yourm2mfield.add(some_item) и т. Д.

3. Когда я пытаюсь ответить = self.client.get(url) во время модульного тестирования. Я получаю сообщение о том, что анонимный пользователь не приемлет ошибку типа: аргумент int() должен быть строкой, байтовым объектом или числом, а не «Анонимным пользователем»

4. @NikhitaSareen: сначала вам нужно будет войти в систему, а также может быть полезно добавить функцию защиты, чтобы вы не создавали Category , если пользователь не указан.

5. Да, вошел в систему . Теперь у меня проблема с self.client.get, я делаю self.response = self.client.get(обратный(‘rango:save_favorite’) Но, похоже, он не выполняет представление, связанное с сохранением избранного, потому что в представлении я сохраняю элемент в БД. Когда я пытаюсь утверждать, что элемент был добавлен, это не удается