Django: Получить true/false с помощью extra(), если в другой таблице существует соответствующая запись
У меня есть модель Registration
с внешним ключом к модели License
который имеет уникальный CharField key
,
Для определенного набора регистраций мне нужно получить логическое значение, если Activation
запись существует с этим лицензионным ключом. Однако между Activation
а также Registration
/License
,
Я могу сделать это в Python так:
regis = Registration.objects.filter(...).select_related("license")
keys = regis.values_list("license__key", flat=True)
activated_keys = ActivationRecord.objects.filter(licensekey__in=keys, action="OK").values_list("licensekey", flat=True)
for r in regis:
r._was_activated = r.free_license.key in activated_keys
Но думал, что это должно быть возможно с extra()
вызов. Просто мои навыки sql не достаточно хороши.
То, что я придумал, было:
Registration.objects.filter(...).extra(
select={"was_activated":"SELECT EXISTS(select * FROM `activation_activationrecord`, `license_license`
where `license_license`.`license_key`=`activation_activationrecord`.`licensekey` AND `activation_activationrecord`.`action` = 'OK')"})
Но r.was_activated
всегда 1
для любой записи, если активирована или нет.
Обновление: здесь связанная часть таблиц:
mysql> Describe activation_activationrecord;
+-----------------+---------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+---------------+------+-----+---------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| licensekey | varchar(250) | YES | MUL | NULL | |
| action | varchar(100) | NO | MUL | NULL | |
+-----------------+---------------+------+-----+---------------------+----------------+
mysql> Describe license_license;
+----------------------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| license_key | varchar(255) | NO | | NULL | |
+----------------------------+--------------+------+-----+---------+----------------+
mysql> Describe registration_registration;
+--------------------------------------------+------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+--------------------------------------------+------------+------+-----+---------+----------------+
| registration_id | int(11) | NO | PRI | NULL | auto_increment |
| license_id | int(11) | NO | UNI | NULL | |
+--------------------------------------------+------------+------+-----+---------+----------------+
Обновление 2: соответствующие модели:
class Registration(models.Model):
id = models.AutoField(db_column="registration_id", primary_key=True)
license = models.OneToOneField(License,
related_name='registration',
default=False,
blank=False)
class License(models.Model):
key = models.CharField(db_column="license_key", max_length= 255)
class ActivationRecord(models.Model):
licensekey = models.CharField(max_length=250, null=True, db_index=True)