一意の CharField を持つモデルRegistration
への外部キーを持つモデルがあります。License
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)