From 8a73519b252f1523130e3953c8fe866f90824f4b Mon Sep 17 00:00:00 2001 From: Dan Parizher <105245560+danparizher@users.noreply.github.com> Date: Mon, 27 Oct 2025 04:19:15 -0400 Subject: [PATCH] [`flake8-django`] Apply `DJ001` to annotated fields (#20907) --- .../test/fixtures/flake8_django/DJ001.py | 6 ++++ .../rules/nullable_model_string_field.rs | 9 ++++-- ..._flake8_django__tests__DJ001_DJ001.py.snap | 29 +++++++++++++++++++ 3 files changed, 42 insertions(+), 2 deletions(-) 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 267c2b69d9..4be84baf30 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 47e463d5df..9ff80f0d52 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 @@ -61,9 +61,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 dccc159fa5..56a8c683fb 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) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + |