﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
37254	Fields.E323 check for mixing python & database-level on_delete values not checked on implicit M2M through tables	Jacob Walls		"This set of models with an explicit `through=` model raises Fields.E323 as expected:

{{{#!py
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:
{{{#!py
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:

{{{#!py
def run():
    user = User.objects.create(username='me')
    person = Person.objects.create(user=user)
    person.hobbies.add(Hobby.objects.create())
    person.delete()
}}}
{{{#!sql
DELETE
FROM ""app_person_hobbies""
WHERE ""app_person_hobbies"".""person_id"" IN (1)
DELETE
FROM ""app_person""
WHERE ""app_person"".""id"" IN (1)
}}}"	Bug	new	Database layer (models, ORM)	6.1	Release blocker			Mariusz Felisiak	Unreviewed	0	0	0	0	0	0
