Я понимаю, что с одноэлементной ситуацией можно выполнить такую операцию как:
spam == eggs
и если spam
и eggs
экземпляры того же класса со всем одинаковым значения атрибута, он возвратится True
. В модели Django это естественно, потому что два отдельных экземпляра модели никогда не будут тем же, если у них не будет того же .pk
значение.
Проблема с этим состоит в том, что, если ссылка на экземпляр имеет атрибуты, которые были обновлены промежуточным программным обеспечением где-нибудь по пути и оно не было сохранено, и Вы пробуете к нему к другой переменной, содержащей ссылку на экземпляр той же модели, оно возвратится False
конечно, потому что у них есть различные значения для некоторых атрибутов. Очевидно, мне не нужно что-то как одиночный элемент, но я задаюсь вопросом, если там некоторый чиновник Djangonic (ха, новое слово) метод для проверки этого, или если я должен просто проверить что .pk
значение является тем же с:
spam.pk == eggs.pk
Я сожалею, если это было огромной пустой тратой времени, но просто кажется, что мог бы быть метод для того, чтобы сделать это и что-то, что я пропускаю это, я буду сожалеть в будущем, если я не найду его.
Необходимо игнорировать первую часть этого вопроса, так как Вы не должны сравнивать одиночные элементы с ==
, а скорее с is
. Одиночные элементы действительно не имеют никакого отношения к этому вопросу.
Вы можете определить метод Class' __eq__
, чтобы определить это поведение:
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
не работает?
Было бы странно, если бы два экземпляра модели сравнивались как равные, если бы у них были разные атрибуты. В большинстве случаев это было бы нежелательно.
То, что вам нужно, - это особый случай. Хорошая идея - сравнить spam.pk == egg.pk
. Если pk
еще нет, потому что они не были сохранены, тогда труднее определить, какие экземпляры «действительно» одинаковы, если некоторые атрибуты различны.
Как насчет добавления настраиваемого атрибута в экземпляры при их создании, например:
spam.myid = 1
, egg.myid = 2
Так в некоторых укажите в коде, когда spamcopy1.seasoning = ketchup
и spamcopy2.seasoning = blackpepper
, вы можете сравнить их атрибут myid
, чтобы увидеть, действительно ли они "одинаковы" " спам.