Fields.E323 check for mixing python & database-level on_delete values not checked on implicit M2M through tables
This set of models with an explicit through= model raises Fields.E323 as expected:
from django.contrib.auth.models import User
from django.db import models
class Hobby(models.Model): ...
class Person(models.Model):
user = models.ForeignKey(User, on_delete=models.DB_CASCADE)
hobbies = models.ManyToManyField(Hobby, through=HobbyXPerson)
class HobbyXPerson(models.Model):
hobby = models.ForeignKey(Hobby, on_delete=models.CASCADE)
person = models.ForeignKey(Person, on_delete=models.CASCADE)
class Meta:
constraints = [
models.UniqueConstraint(
fields=["person", "hobby"], name="unique_person_hobby"
)
]
ERRORS:
app.HobbyXPerson.person: (fields.E323) Field specifies Python-level on_delete variant, but referenced model uses database-level variant.
HINT: Use either database or Python on_delete variants uniformly in the references chain.
But this one does not:
from django.contrib.auth.models import User
from django.db import models
class Hobby(models.Model): ...
class Person(models.Model):
user = models.ForeignKey(User, on_delete=models.DB_CASCADE)
hobbies = models.ManyToManyField(Hobby)
Deletions are still collected in python:
def run():
user = User.objects.create(username='me')
person = Person.objects.create(user=user)
person.hobbies.add(Hobby.objects.create())
person.delete()
DELETE
FROM "app_person_hobbies"
WHERE "app_person_hobbies"."person_id" IN (1)
DELETE
FROM "app_person"
WHERE "app_person"."id" IN (1)
Change History
(7)
| Owner: |
set to Mariusz Felisiak
|
| Status: |
new → assigned
|
| Triage Stage: |
Unreviewed → Accepted
|
| Patch needs improvement: |
set
|
| Patch needs improvement: |
unset
|
| Triage Stage: |
Accepted → Ready for checkin
|
| Resolution: |
→ fixed
|
| Status: |
assigned → closed
|
PR