Каковы потенциальные побочные эффекты перезаписи __eq__ и __hash__ в среде Django? - PullRequest
1 голос
/ 23 сентября 2019

Я работаю с коллекциями экземпляров модели, определенной в моем приложении 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...