0

一意の CharField を持つモデルRegistrationへの外部キーを持つモデルがあります。Licensekey

特定の登録セットについて、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)
4

0 に答える 0