Probably this would help:
https://stackoverflow.com/questions/8609192/what-is-the-difference-between-null-true-and-blank-true-in-django

On Wed, May 10, 2023 at 5:45 PM 'Bob Aalsma' via Django users <
[email protected]> wrote:

> Sorry Vishesh, thanks for the quick answer but I have no idea what you
> mean.
>
> On Wednesday, May 10, 2023 at 2:00:51 PM UTC+2 Vishesh Mangla wrote:
>
>> False or True check for yourself.
>>
>> On Wed, 10 May, 2023, 17:29 Vishesh Mangla, <[email protected]> wrote:
>>
>>> It looks like you are passing a null but null=False is not set
>>>
>>> On Wed, 10 May, 2023, 17:27 'Bob Aalsma' via Django users, <
>>> [email protected]> wrote:
>>>
>>>> I'm trying to test a django-admin command and don't understand why the
>>>> tests give errors on the code while the code works as expected.
>>>>
>>>> I'm under the impression that the *raise CommandError* is ignored by
>>>> the test, but don't understand why this would be.
>>>>
>>>> Please help.
>>>>
>>>> Running the code shows:
>>>>
>>>> (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py
>>>> populate_source 0
>>>>
>>>> *CommandError: Alleen hele getallen > 0 toegestaan*
>>>>
>>>> (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py
>>>> populate_source 1
>>>>
>>>> *Teksten zijn gegenereerd voor tekstlengte 1*
>>>>
>>>> (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py
>>>> populate_source 1
>>>>
>>>> *CommandError: Teksten voor nummer 1 zijn al eerder gegenereerd*
>>>>
>>>> (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py
>>>> populate_source 7
>>>>
>>>> *CommandError: Opgegeven sleutel 7 niet gevonden*
>>>>
>>>> Running the tests shows
>>>>
>>>> (.venv) werker@Werkers-Mac-mini domain_reader % python3 manage.py test
>>>> tests.test_sources_app_command_populate
>>>>
>>>> Found 3 test(s).
>>>>
>>>> Creating test database for alias 'default'...
>>>>
>>>> System check identified no issues (0 silenced).
>>>>
>>>> EEE
>>>>
>>>> ======================================================================
>>>>
>>>> ERROR: test_command_output_been_there
>>>> (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_been_there)
>>>>
>>>> Test for failure: in_use = True.
>>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 89, in _execute
>>>>
>>>>     return self.cursor.execute(sql, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py",
>>>> line 328, in execute
>>>>
>>>>     return super().execute(query, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>> sqlite3.IntegrityError: NOT NULL constraint failed:
>>>> domain_sources_app_characternumber.number_of_combinations
>>>>
>>>>
>>>> The above exception was the direct cause of the following exception:
>>>>
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py",
>>>> line 30, in test_command_output_been_there
>>>>
>>>>     thingy.save()
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 814, in save
>>>>
>>>>     self.save_base(
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 877, in save_base
>>>>
>>>>     updated = self._save_table(
>>>>
>>>>               ^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 1020, in _save_table
>>>>
>>>>     results = self._do_insert(
>>>>
>>>>               ^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 1061, in _do_insert
>>>>
>>>>     return manager._insert(
>>>>
>>>>            ^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/manager.py",
>>>> line 87, in manager_method
>>>>
>>>>     return getattr(self.get_queryset(), name)(*args, **kwargs)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/query.py",
>>>> line 1805, in _insert
>>>>
>>>>     return query.get_compiler(using=using).execute_sql(returning_fields)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py",
>>>> line 1820, in execute_sql
>>>>
>>>>     cursor.execute(sql, params)
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 67, in execute
>>>>
>>>>     return self._execute_with_wrappers(
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 80, in _execute_with_wrappers
>>>>
>>>>     return executor(sql, params, many, context)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 84, in _execute
>>>>
>>>>     with self.db.wrap_database_errors:
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/utils.py",
>>>> line 91, in __exit__
>>>>
>>>>     raise dj_exc_value.with_traceback(traceback) from exc_value
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 89, in _execute
>>>>
>>>>     return self.cursor.execute(sql, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py",
>>>> line 328, in execute
>>>>
>>>>     return super().execute(query, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>> django.db.utils.IntegrityError: NOT NULL constraint failed:
>>>> domain_sources_app_characternumber.number_of_combinations
>>>>
>>>>
>>>> ======================================================================
>>>>
>>>> ERROR: test_command_output_small
>>>> (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_small)
>>>>
>>>> Test for failure with value '0'.
>>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py",
>>>> line 20, in test_command_output_small
>>>>
>>>>     call_command("populate_source", 0, stdout=out)
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/core/management/__init__.py",
>>>> line 194, in call_command
>>>>
>>>>     return command.execute(*args, **defaults)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/core/management/base.py",
>>>> line 458, in execute
>>>>
>>>>     output = self.handle(*args, **options)
>>>>
>>>>              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/domain_sources_app/management/commands/populate_source.py",
>>>> line 36, in handle
>>>>
>>>>     raise CommandError('Alleen hele getallen > 0 toegestaan')
>>>>
>>>> django.core.management.base.CommandError: Alleen hele getallen > 0
>>>> toegestaan
>>>>
>>>>
>>>> ======================================================================
>>>>
>>>> ERROR: test_command_output_success
>>>> (tests.test_sources_app_command_populate.PopulateSourceTests.test_command_output_success)
>>>>
>>>> Test for success: in_use = False.
>>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 89, in _execute
>>>>
>>>>     return self.cursor.execute(sql, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py",
>>>> line 328, in execute
>>>>
>>>>     return super().execute(query, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>> sqlite3.IntegrityError: NOT NULL constraint failed:
>>>> domain_sources_app_characternumber.number_of_combinations
>>>>
>>>>
>>>> The above exception was the direct cause of the following exception:
>>>>
>>>>
>>>> Traceback (most recent call last):
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/tests/test_sources_app_command_populate.py",
>>>> line 48, in test_command_output_success
>>>>
>>>>     thingy.save()
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 814, in save
>>>>
>>>>     self.save_base(
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 877, in save_base
>>>>
>>>>     updated = self._save_table(
>>>>
>>>>               ^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 1020, in _save_table
>>>>
>>>>     results = self._do_insert(
>>>>
>>>>               ^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/base.py",
>>>> line 1061, in _do_insert
>>>>
>>>>     return manager._insert(
>>>>
>>>>            ^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/manager.py",
>>>> line 87, in manager_method
>>>>
>>>>     return getattr(self.get_queryset(), name)(*args, **kwargs)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/query.py",
>>>> line 1805, in _insert
>>>>
>>>>     return query.get_compiler(using=using).execute_sql(returning_fields)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/models/sql/compiler.py",
>>>> line 1820, in execute_sql
>>>>
>>>>     cursor.execute(sql, params)
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 67, in execute
>>>>
>>>>     return self._execute_with_wrappers(
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 80, in _execute_with_wrappers
>>>>
>>>>     return executor(sql, params, many, context)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 84, in _execute
>>>>
>>>>     with self.db.wrap_database_errors:
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/utils.py",
>>>> line 91, in __exit__
>>>>
>>>>     raise dj_exc_value.with_traceback(traceback) from exc_value
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/utils.py",
>>>> line 89, in _execute
>>>>
>>>>     return self.cursor.execute(sql, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>>   File
>>>> "/Users/werker/Projects/domain_reader/.venv/lib/python3.11/site-packages/django/db/backends/sqlite3/base.py",
>>>> line 328, in execute
>>>>
>>>>     return super().execute(query, params)
>>>>
>>>>            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
>>>>
>>>> django.db.utils.IntegrityError: NOT NULL constraint failed:
>>>> domain_sources_app_characternumber.number_of_combinations
>>>>
>>>>
>>>> ----------------------------------------------------------------------
>>>>
>>>> Ran 3 tests in 0.008s
>>>>
>>>>
>>>> FAILED (errors=3)
>>>>
>>>> Destroying test database for alias 'default'...
>>>>
>>>> Code for test:
>>>> from io import StringIO
>>>>
>>>> from django.core.management import call_command
>>>> from django.test import TestCase
>>>>
>>>> from domain_sources_app.models import CharacterNumber
>>>>
>>>>
>>>> class PopulateSourceTests(TestCase):
>>>> """Testcases for Django-admin command populate_source."""
>>>> def test_command_output_small(self):
>>>> """Test for failure with value '0'."""
>>>> out = StringIO()
>>>> call_command("populate_source", 0, stdout=out)
>>>> self.assertIn("Alleen hele getallen > 0 toegestaan", out.getvalue())
>>>>
>>>> def test_command_output_been_there(self):
>>>> """Test for failure: in_use = True."""
>>>>
>>>> thingy = CharacterNumber(
>>>> number_of_characters=1,
>>>> in_use=True,
>>>> )
>>>> thingy.save()
>>>>
>>>> out = StringIO()
>>>> call_command(
>>>> "populate_source",
>>>> 1,
>>>> stdout=out,
>>>> )
>>>> self.assertIn("Teksten voor nummer 1 zijn al \
>>>> eerder gegenereerd", out.getvalue())
>>>>
>>>> def test_command_output_success(self):
>>>> """Test for success: in_use = False."""
>>>>
>>>> thingy = CharacterNumber(
>>>> number_of_characters=1,
>>>> in_use=False,
>>>> )
>>>> thingy.save()
>>>>
>>>> out = StringIO()
>>>> call_command(
>>>> "populate_source",
>>>> 1,
>>>> stdout=out,
>>>> )
>>>> self.assertIn("Teksten gegenereerd voor nummer 1", out.getvalue())
>>>>
>>>>
>>>>
>>>> Code for the command:
>>>> from django.core.management.base import BaseCommand
>>>> from django.core.management.base import CommandError
>>>>
>>>> from domain_sources_app.models import CharacterNumber
>>>> from domain_sources_app.generate_domain_strings import
>>>> generate_domain_strings
>>>>
>>>>
>>>> class Command(BaseCommand):
>>>> """Populate Result with inital strings of
>>>> a certain length.
>>>>
>>>> Args:
>>>> BaseCommand (_type_): _description_
>>>>
>>>> Raises:
>>>> CommandError: _description_
>>>> """
>>>> help = "Genereert de te onderzoeken combinaties bij de opgegeven
>>>> lengte"
>>>>
>>>> def add_arguments(self, parser):
>>>> parser.add_argument("character_number_ids", nargs="+", type=int)
>>>>
>>>> def handle(self, *args, **options):
>>>> for character_number_id in options["character_number_ids"]:
>>>> if character_number_id < 1:
>>>> raise CommandError('Alleen hele getallen > 0 toegestaan')
>>>> else:
>>>> try:
>>>> thingy = CharacterNumber.objects.get(
>>>> pk=character_number_id
>>>> )
>>>> except CharacterNumber.DoesNotExist:
>>>> raise CommandError(
>>>> f'Opgegeven sleutel {character_number_id} \
>>>> niet gevonden')
>>>>
>>>> if not thingy.in_use:
>>>> # generate for this number:
>>>> generate_domain_strings(character_number_id)
>>>> # register use of CharacterNumber
>>>> thingy.in_use = True
>>>> thingy.save()
>>>>
>>>> self.stdout.write(
>>>> self.style.SUCCESS(
>>>> f'Teksten zijn gegenereerd voor \
>>>> tekstlengte {character_number_id}'
>>>> )
>>>> )
>>>> else:
>>>> raise CommandError(
>>>> f'Teksten voor nummer {character_number_id} zijn al \
>>>> eerder gegenereerd'
>>>> )
>>>>
>>>>
>>>>
>>>>
>>>> Thanks,
>>>> Bob
>>>>
>>>> --
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Django users" group.
>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>> an email to [email protected].
>>>> To view this discussion on the web visit
>>>> https://groups.google.com/d/msgid/django-users/1d0ce155-35e7-4049-88d4-80124c83dedcn%40googlegroups.com
>>>> <https://groups.google.com/d/msgid/django-users/1d0ce155-35e7-4049-88d4-80124c83dedcn%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>> .
>>>>
>>> --
> You received this message because you are subscribed to the Google Groups
> "Django users" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/django-users/723ee45e-6b7f-4434-b2d8-64ecb3170ff2n%40googlegroups.com
> <https://groups.google.com/d/msgid/django-users/723ee45e-6b7f-4434-b2d8-64ecb3170ff2n%40googlegroups.com?utm_medium=email&utm_source=footer>
> .
>

-- 
You received this message because you are subscribed to the Google Groups 
"Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/django-users/CACaE8x7VR4Q1wB2mvvmA7-R3Vcgor%2Bnmk3i3AtdipTmoKkKmmg%40mail.gmail.com.

Reply via email to