#django #mysql-workbench #django-queryset
#django #mysql-workbench #django-queryset
Вопрос:
Мой запрос выполнен в MYSQL, я хотел бы знать, как перевести его в ORM django благодарит вас
SELECT *,(SELECT count(*)
FROM tesisnueva.donador_desactivar ds
where ds.motivo=1 and
ds.donador_id= dd.id and
date_add(ds.fecha_desactivar, INTERVAL 90 DAY)<now()) as cantidad
FROM tesisnueva.donador_donador dd
where dd.genero='F';
МОИ МОДЕЛИ
class Donador(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE)
hospital = models.ForeignKey(Hospital, null=True, blank=True, on_delete=models.SET_NULL)
fecha_nacimiento = models.DateField(validators=[check_date])
direccion = models.CharField(max_length=50,null=False,blank=False)
genero = models.CharField( max_length=1 , choices = GENERO, default='M')
grupo_sanguineo = models.CharField(max_length=10,choices=GRUPO_SANGRE, default='A')
factor_RH = models.CharField(max_length=2, choices=FACTOR_SANGRE, default=' ')
telefono = models.CharField(max_length=12)
activo = models.BooleanField(default=0)
groups = models.ForeignKey(Group, null=True, blank=True, on_delete=models.CASCADE)
class Desactivar(models.Model):
donador = models.ForeignKey(Donador,on_delete=models.CASCADE)
motivo= models.IntegerField()
fecha_desactivar=models.DateField()
Комментарии:
1. Пожалуйста, поделитесь данными связанными моделями.
2. Я читал, что это можно сделать с помощью внешней ссылки и с помощью подзапроса, но. Я не понимаю, как?
Ответ №1:
Вы можете использовать .annotate(…)
[Django-doc] и использовать filter=…
параметр [Django-doc] для соответствующей фильтрации связанной модели:
from datetime import timedelta
from django.db.models import Q
from django.utils.timezone import now
Donador.objects.filter(genero='F').annotate(
cantidad=Count(
'desactivar',
filter=Q(motivo=1, fecha_desactivar=now()-timedelta(days=90))
)
)
Donador
Объекты, возникающие из этого набора запросов, имеют дополнительный атрибут, .cantidad
который содержит количество связанных desactivar
объектов, удовлетворяющих заданному фильтру.
Комментарии:
1. Ван Осен Donador не содержит поля fecha_descativar
2. произошла эта ошибка. django.core.exceptions. Ошибка поля: не удается преобразовать ключевое слово ‘fecha_desactivar’ в поле. Варианты: activo, desactivar, direccion, donacion, factor_RH, fecha_nacimiento, genero, группы, groups_id, grupo_sanguineo, больница, hospital_id, идентификатор, telefono, пользователь, user_id
3. @MauricioRiera: похоже, что название вашего поля
desactivar
тогда (поскольку оно указано в параметрах), значит, так оно и естьQ(motivo=1, desactivar=now()-timedelta(days=90))
. Пожалуйста, прочитайте сообщения об исключениях.