Django, сравнивающий образцовые экземпляры для равенства

Я понимаю, что с одноэлементной ситуацией можно выполнить такую операцию как:

spam == eggs

и если spam и eggs экземпляры того же класса со всем одинаковым значения атрибута, он возвратится True. В модели Django это естественно, потому что два отдельных экземпляра модели никогда не будут тем же, если у них не будет того же .pk значение.

Проблема с этим состоит в том, что, если ссылка на экземпляр имеет атрибуты, которые были обновлены промежуточным программным обеспечением где-нибудь по пути и оно не было сохранено, и Вы пробуете к нему к другой переменной, содержащей ссылку на экземпляр той же модели, оно возвратится False конечно, потому что у них есть различные значения для некоторых атрибутов. Очевидно, мне не нужно что-то как одиночный элемент, но я задаюсь вопросом, если там некоторый чиновник Djangonic (ха, новое слово) метод для проверки этого, или если я должен просто проверить что .pk значение является тем же с:

spam.pk == eggs.pk

Я сожалею, если это было огромной пустой тратой времени, но просто кажется, что мог бы быть метод для того, чтобы сделать это и что-то, что я пропускаю это, я буду сожалеть в будущем, если я не найду его.

ОБНОВЛЕНИЕ (02-27-2015)

Необходимо игнорировать первую часть этого вопроса, так как Вы не должны сравнивать одиночные элементы с ==, а скорее с is. Одиночные элементы действительно не имеют никакого отношения к этому вопросу.

38
задан Community 23 May 2017 в 12:34
поделиться

3 ответа

Вы можете определить метод Class' __eq__, чтобы определить это поведение:

http://docs.python.org/reference/datamodel.html

5
ответ дан 27 November 2019 в 03:10
поделиться

spam.pk == eggs.pk - хороший способ сделать это.

Вы можете добавить __eq__ в вашу модель, но я буду избегать этого, потому что это сбивает с толку, так как == может означать разные вещи в разных контекстах, например, я могу хотеть, чтобы == означало, что содержимое одинаково, а id может отличаться, поэтому опять же лучший способ -

spam.pk == eggs.pk

Редактировать: btw в django 1.0.2 класс Model определил __eq__ как

def __eq__(self, other):
    return isinstance(other, self.__class__) and self._get_pk_val() == other._get_pk_val() 

что кажется таким же, как spam.pk == eggs.pk, поскольку pk - это свойство, которое использует _get_pk_val. поэтому я не понимаю, почему spam == eggs не работает?

17
ответ дан 27 November 2019 в 03:10
поделиться

Было бы странно, если бы два экземпляра модели сравнивались как равные, если бы у них были разные атрибуты. В большинстве случаев это было бы нежелательно.

То, что вам нужно, - это особый случай. Хорошая идея - сравнить spam.pk == egg.pk . Если pk еще нет, потому что они не были сохранены, тогда труднее определить, какие экземпляры «действительно» одинаковы, если некоторые атрибуты различны.

Как насчет добавления настраиваемого атрибута в экземпляры при их создании, например: spam.myid = 1 , egg.myid = 2

Так в некоторых укажите в коде, когда spamcopy1.seasoning = ketchup и spamcopy2.seasoning = blackpepper , вы можете сравнить их атрибут myid , чтобы увидеть, действительно ли они "одинаковы" " спам.

0
ответ дан 27 November 2019 в 03:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: