我有两个不同的模型,彼此没有关系,但继承自抽象模型,这两个模型有共同的电子邮件字段,我想检查此模型中包含的电子邮件值是否存在于另一个模型中。这是我的模特。
class BaseRespondent(SafeDeleteModel):
_safedelete_policy = SOFT_DELETE_CASCADE
class Meta:
abstract = True
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
name = models.CharField(max_length=256)
email = models.EmailField()
pos_applied = models.ForeignKey(PositionApplied, on_delete=_safedelete_policy,
null=True)
date = models.DateField(auto_now_add=True)
test = models.ForeignKey(Test, on_delete=models.SET_NULL, null=True, blank=True)
class Respondent(BaseRespondent):
least_disc = models.CharField(max_length=256, default='')
most_disc = models.CharField(max_length=256, default='')
most_personality = models.ForeignKey(Personality, on_delete=models.SET_NULL,
null=True, related_name="most_personality")
least_personality = models.ForeignKey(Personality, on_delete=models.SET_NULL,
null=True, related_name="least_personality")
# combine = GenericRelation(Combined_Respondent, related_query_name='disc')
def result(self):
return format_html(
'<a href="{0}result/{1}">View result</a>',
settings.SITE_URL,
self.id,
)
class Meta:
verbose_name = "DISC Respondent"
verbose_name_plural = "DISC Respondents"
class MBTIRespondent(BaseRespondent):
first_col_component = models.CharField(max_length=32, null=True)
first_col_score = models.CharField(max_length=32, null=True)
third_col_component = models.CharField(max_length=32, null=True)
third_col_score = models.CharField(max_length=32, null=True)
fifth_col_component = models.CharField(max_length=32, null=True)
fifth_col_score = models.CharField(max_length=32, null=True)
seventh_col_component = models.CharField(max_length=32, null=True)
seventh_col_score = models.CharField(max_length=32, null=True)
personality = models.ForeignKey(MbtiPersonality, on_delete=models.SET_NULL,
null=True)
# combine = GenericRelation(Combined_Respondent, related_query_name='mbti')
def result(self):
return format_html(
'<a href="{0}result/mbti/{1}">View result</a>',
settings.SITE_URL,
self.id,
)
class Meta:
verbose_name = "MBTI Respondent"
verbose_name_plural = "MBTI Respondents"
我希望能够只显示Respondent和MBTIRespondent中存在的类似电子邮件
如果您想通过MBTIRespondent中的电子邮件获取所有受访者,您可以执行以下操作:
mtb_emails = MBTIRespondent.objects.values_list('email', flat=True)
respondent_with_mtb_emails = Respondent.objects.filter(email__in=mtb_emails)
另一种方法是连接两个表,但您必须使用connection.cursor()编写原始查询。
cursor = connection.cursor().
cursor.execute('''SELECT * from %s as r inner join %s as mr on r.email=mr.email''' % (Respondent._meta.db_table, MBTIRespondent._meta.db_table))
rows = cursor.fetchall()