Перенаправить этот набор запросов?

#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)) . Пожалуйста, прочитайте сообщения об исключениях.