diff --git a/crates/ruff_linter/resources/test/fixtures/flake8_django/DJ001.py b/crates/ruff_linter/resources/test/fixtures/flake8_django/DJ001.py index 267c2b69d9be7..4be84baf30a4b 100644 --- a/crates/ruff_linter/resources/test/fixtures/flake8_django/DJ001.py +++ b/crates/ruff_linter/resources/test/fixtures/flake8_django/DJ001.py @@ -46,3 +46,9 @@ class CorrectModel(models.Model): max_length=255, null=True, blank=True, unique=True ) urlfieldu = models.URLField(max_length=255, null=True, blank=True, unique=True) + + +class IncorrectModelWithSimpleAnnotations(models.Model): + charfield: models.CharField = models.CharField(max_length=255, null=True) + textfield: models.TextField = models.TextField(max_length=255, null=True) + slugfield: models.SlugField = models.SlugField(max_length=255, null=True) diff --git a/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs b/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs index 3157e6f4fb71a..23b1877452462 100644 --- a/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs +++ b/crates/ruff_linter/src/rules/flake8_django/rules/nullable_model_string_field.rs @@ -60,9 +60,14 @@ pub(crate) fn nullable_model_string_field(checker: &Checker, body: &[Stmt]) { } for statement in body { - let Stmt::Assign(ast::StmtAssign { value, .. }) = statement else { - continue; + let value = match statement { + Stmt::Assign(ast::StmtAssign { value, .. }) => value, + Stmt::AnnAssign(ast::StmtAnnAssign { + value: Some(value), .. + }) => value, + _ => continue, }; + if let Some(field_name) = is_nullable_field(value, checker.semantic()) { checker.report_diagnostic( DjangoNullableModelStringField { diff --git a/crates/ruff_linter/src/rules/flake8_django/snapshots/ruff_linter__rules__flake8_django__tests__DJ001_DJ001.py.snap b/crates/ruff_linter/src/rules/flake8_django/snapshots/ruff_linter__rules__flake8_django__tests__DJ001_DJ001.py.snap index dccc159fa575c..56a8c683fba0e 100644 --- a/crates/ruff_linter/src/rules/flake8_django/snapshots/ruff_linter__rules__flake8_django__tests__DJ001_DJ001.py.snap +++ b/crates/ruff_linter/src/rules/flake8_django/snapshots/ruff_linter__rules__flake8_django__tests__DJ001_DJ001.py.snap @@ -186,3 +186,32 @@ DJ001 Avoid using `null=True` on string-based fields such as `URLField` 30 | urlfield = models.URLField(max_length=255, null=True) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | + +DJ001 Avoid using `null=True` on string-based fields such as `CharField` + --> DJ001.py:52:35 + | +51 | class IncorrectModelWithSimpleAnnotations(models.Model): +52 | charfield: models.CharField = models.CharField(max_length=255, null=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +53 | textfield: models.TextField = models.TextField(max_length=255, null=True) +54 | slugfield: models.SlugField = models.SlugField(max_length=255, null=True) + | + +DJ001 Avoid using `null=True` on string-based fields such as `TextField` + --> DJ001.py:53:35 + | +51 | class IncorrectModelWithSimpleAnnotations(models.Model): +52 | charfield: models.CharField = models.CharField(max_length=255, null=True) +53 | textfield: models.TextField = models.TextField(max_length=255, null=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +54 | slugfield: models.SlugField = models.SlugField(max_length=255, null=True) + | + +DJ001 Avoid using `null=True` on string-based fields such as `SlugField` + --> DJ001.py:54:35 + | +52 | charfield: models.CharField = models.CharField(max_length=255, null=True) +53 | textfield: models.TextField = models.TextField(max_length=255, null=True) +54 | slugfield: models.SlugField = models.SlugField(max_length=255, null=True) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + |