﻿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
37309	`Model.__eq__` treats distinct unsaved composite-PK instances as equal	Denny Biasiolli		"{{{Model.__eq__}}} still uses {{{pk is None}}} to decide whether an instance is unsaved. That is wrong for composite primary keys ({{{pk}}} is a tuple) and for {{{db_default}}} PKs ({{{DatabaseDefault}}} is not {{{None}}}).

{{{
>>> User() == User()
True
>>> User(tenant_id=1) == User(tenant_id=1)
True
}}}

Documented contract (and simple-PK behavior since #18864 / #18250) is that unsaved instances are equal only to themselves. {{{__hash__}}} already uses {{{_is_pk_set()}}} and raises for an unset PK.

The XML serializer has the same leftover ({{{if obj.pk is not None}}}) and emits {{{pk='[""None"", ""None""]'}}} for an unsaved composite instance instead of omitting the attribute.

Proposed fix: use {{{_is_pk_set()}}} in both places, matching {{{__hash__}}} and the rest of the #373 conversion.

Related: #18864, #18250, #373."	Bug	new	Database layer (models, ORM)	5.2	Normal		compositeprimarykey _is_pk_set		Unreviewed	1	0	0	0	1	0
