Я работаю с коллекциями экземпляров модели, определенной в моем приложении Django, и было бы полезно, если бы я мог использовать класс set
для обработки этих коллекций.Для правильного сравнения этих экземпляров модели мне необходимо переопределить методы __eq__
и __hash__
в этих моделях, чтобы они больше не использовали встроенные идентификаторы моделей.
Например, если бы у меня былмодель "виджета" с полями "expiry" и "amount", мне нужно, чтобы экземпляры модели считались равными в наборах, когда они имеют одинаковые значения "expiry" и "amount", даже если у них разные идентификаторы.
Я переопределил эти методы для сравнения экземпляров модели на основе подмножества их полей.Я больше не использую pks / ids модели для проверки эквивалентности:
class Widget(model):
expiry = models.DateField(null=True, blank=True)
quantity = models.CharField(max_length=255, blank=True)
...
def __eq__(self, other):
if not isinstance(other, Widget):
return False
else:
return (
self.expiry == other.expiry and
self.quantity == other.quantity)
def __hash__(self):
widget_hash = hash(
hash(self.expiry) ^
hash(self.quantity))
return widget_hash
...
Мой код, использующий класс set
для обработки коллекций, работает по мере необходимости, однако меня беспокоит, какие побочные эффектыэти изменения могут иметь место в инфраструктуре Django.
Использует ли Django базовую реализацию __eq__
и __hash__
?Будут ли побочные эффекты в структуре Django, потому что я изменил реализацию __eq__
и __hash__
, чтобы больше не использовать уникальные идентификаторы?
В качестве альтернативы, есть ли способ переопределитьset
установить класс или внедрить пользовательские методы для проверки эквивалентности при использовании таких методов, как difference
?