基于两种模型从数据库中进行django查询
Make django query from database based on two models
我正在开发搜索页面,医生可以在该页面上搜索具有 name
、start_date
和 end_date
的患者。这里 start_date 和 end_date 是任何文档上传的日期范围。结果应该 return 所有姓名为 name
并且在 start_date
和 end_date
之间上传文件的患者。
class Document(models.Model):
name = models.CharField(max_length=15, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
patient = models.ForeignKey(to=Patient, on_delete=models.CASCADE, unique=False)
class Meta:
unique_together = ('name', 'document', 'patient')
# many document can have same patient
def __str__(self) -> str:
return f'{self.name}'
def __repr__(self) -> str:
return f'{self.name}'
class Patient(models.Model):
# required fields
first_name = models.CharField(max_length=55, blank=False, null=False)
last_name = models.CharField(max_length=55, blank=False, null=False)
email = models.EmailField(max_length=255, blank=False, null=False, unique=True)
# not required fields
address = models.TextField(max_length=255, blank=True, null=True)
postal_zip = models.IntegerField(max_length=255, blank=True, null=True)
city = models.CharField(max_length=255, blank=True, null=True)
country = models.CharField(max_length=255, blank=True, null=True)
phone_number = models.IntegerField(max_length=17, blank=True, null=True) # mobile
alternate_number = models.IntegerField(max_length=17, blank=True, null=True) # alternate
def __str__(self) -> str:
return f"{self.first_name} {self.last_name}"
def __repr__(self) -> str:
return f"{self.first_name} {self.last_name}"
我可以像这样在特定日期之间上传所有文档
documents = Document.objects.filter(
uploaded_at__gte=start_date
).intersection(
Document.objects.filter(uploaded_at__lte=end_date)
)
但我想不出将上述结果与此结合的方法
query = Patient.objects.filter(
Q(first_name__icontains=search_key) |
Q(last_name__icontains=search_key) |
Q(email__icontains=search_key) |
Q(city__icontains=search_key) |
Q(phone_number__icontains=search_key) |
Q(alternate_number__icontains=search_key) |
Q(country__icontains=search_key)
)
你可以使用双下划线来查看一个关系,所以这里我们可以过滤Patient
s,其中有给定范围内的文档:
# Patients which match the search_key, and have
# documents uploaded in the (start_date, end_date) range
query = Patient.objects.filter(
Q(first_name__icontains=search_key) |
Q(last_name__icontains=search_key) |
Q(email__icontains=search_key) |
Q(city__icontains=search_key) |
Q(phone_number__icontains=search_key) |
Q(alternate_number__icontains=search_key) |
Q(country__icontains=search_key),
<b>document__uploaded_at__range=(start_date, end_date)</b>
)<b>.distinct()</b>
此处的 .distinct()
可防止您多次检索同一患者(范围内每个 Document
一次)。
或 Document
具有符合给定条件的 Patient
:
# Documents uploaded in the (start_date, end_date) range
# which match a Patient with the search_key.
query = Document.objects.filter(
Q(<b>patient__</b>first_name__icontains=search_key) |
Q(<b>patient__</b>last_name__icontains=search_key) |
Q(<b>patient__</b>email__icontains=search_key) |
Q(<b>patient__</b>city__icontains=search_key) |
Q(<b>patient__</b>phone_number__icontains=search_key) |
Q(<b>patient__</b>alternate_number__icontains=search_key) |
Q(<b>patient__</b>country__icontains=search_key),
uploaded_at__range=(start_date, end_date)
)
我正在开发搜索页面,医生可以在该页面上搜索具有 name
、start_date
和 end_date
的患者。这里 start_date 和 end_date 是任何文档上传的日期范围。结果应该 return 所有姓名为 name
并且在 start_date
和 end_date
之间上传文件的患者。
class Document(models.Model):
name = models.CharField(max_length=15, blank=True)
document = models.FileField(upload_to='documents/')
uploaded_at = models.DateTimeField(auto_now_add=True)
patient = models.ForeignKey(to=Patient, on_delete=models.CASCADE, unique=False)
class Meta:
unique_together = ('name', 'document', 'patient')
# many document can have same patient
def __str__(self) -> str:
return f'{self.name}'
def __repr__(self) -> str:
return f'{self.name}'
class Patient(models.Model):
# required fields
first_name = models.CharField(max_length=55, blank=False, null=False)
last_name = models.CharField(max_length=55, blank=False, null=False)
email = models.EmailField(max_length=255, blank=False, null=False, unique=True)
# not required fields
address = models.TextField(max_length=255, blank=True, null=True)
postal_zip = models.IntegerField(max_length=255, blank=True, null=True)
city = models.CharField(max_length=255, blank=True, null=True)
country = models.CharField(max_length=255, blank=True, null=True)
phone_number = models.IntegerField(max_length=17, blank=True, null=True) # mobile
alternate_number = models.IntegerField(max_length=17, blank=True, null=True) # alternate
def __str__(self) -> str:
return f"{self.first_name} {self.last_name}"
def __repr__(self) -> str:
return f"{self.first_name} {self.last_name}"
我可以像这样在特定日期之间上传所有文档
documents = Document.objects.filter(
uploaded_at__gte=start_date
).intersection(
Document.objects.filter(uploaded_at__lte=end_date)
)
但我想不出将上述结果与此结合的方法
query = Patient.objects.filter(
Q(first_name__icontains=search_key) |
Q(last_name__icontains=search_key) |
Q(email__icontains=search_key) |
Q(city__icontains=search_key) |
Q(phone_number__icontains=search_key) |
Q(alternate_number__icontains=search_key) |
Q(country__icontains=search_key)
)
你可以使用双下划线来查看一个关系,所以这里我们可以过滤Patient
s,其中有给定范围内的文档:
# Patients which match the search_key, and have
# documents uploaded in the (start_date, end_date) range
query = Patient.objects.filter(
Q(first_name__icontains=search_key) |
Q(last_name__icontains=search_key) |
Q(email__icontains=search_key) |
Q(city__icontains=search_key) |
Q(phone_number__icontains=search_key) |
Q(alternate_number__icontains=search_key) |
Q(country__icontains=search_key),
<b>document__uploaded_at__range=(start_date, end_date)</b>
)<b>.distinct()</b>
此处的 .distinct()
可防止您多次检索同一患者(范围内每个 Document
一次)。
或 Document
具有符合给定条件的 Patient
:
# Documents uploaded in the (start_date, end_date) range
# which match a Patient with the search_key.
query = Document.objects.filter(
Q(<b>patient__</b>first_name__icontains=search_key) |
Q(<b>patient__</b>last_name__icontains=search_key) |
Q(<b>patient__</b>email__icontains=search_key) |
Q(<b>patient__</b>city__icontains=search_key) |
Q(<b>patient__</b>phone_number__icontains=search_key) |
Q(<b>patient__</b>alternate_number__icontains=search_key) |
Q(<b>patient__</b>country__icontains=search_key),
uploaded_at__range=(start_date, end_date)
)