如何使用Django Orm进行此查询?

时间:2019-05-18 17:37:32

标签: django-orm

我有一个Profile模型和Complain模型都连接到内置的User模型。我必须同时使用Profile模型所在的位置进行查询。我想算一下,从一个特定的住所有多少投诉。我可以使用SQL来实现,但是我不知道如何使用Django来实现。

SELECT users_profile.residence,count(user_id)from users_profile INNER JOIN chp_complain on(users_profile.user_id = chp_complain.complain_user_id)GROUP BY(user_id)

投诉模型:-

class Complain(models.Model):

    complain_user = models.ForeignKey(User, on_delete=models.CASCADE)
    complain_department=models.CharField(max_length=100)
    complain_subject = models.CharField(max_length = 100,help_text =  "Enter the complain subject")
    department_head=models.CharField(max_length=100)
    recepient=models.CharField(max_length=100)
    complain_description=models.TextField(max_length=2000)
    date_posted = models.DateTimeField(default = timezone.now)
    NOT_VISITED = 'NV'
    VISITED = 'V'
    INPROCESS = 'IP'
    COMPLETED = 'C'
    status = (
        (NOT_VISITED, 'NV'),
        (VISITED, 'V'),
        (INPROCESS, 'IP'),
        (COMPLETED, 'C'),)
    status=models.CharField(max_length=2,choices=status,)

个人资料模型:-

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    UID =models.CharField(max_length=30,default = "000",help_text = "'Staff's fill their STAFF ID and student's fill their ROLL NO " )
    MALE = 'M'
    FEMALE = 'F'
    Gender=((MALE, 'Male'),(FEMALE, 'Female'),)
    Gender=models.CharField(max_length=6,choices=Gender,default=MALE,)
    FIRST = '1st'
    SECOND = '2nd'
    THIRD = '3rd'
    FOURTH = '4th'
    NGH = 'NGH'
    NON_HOSTELER = 'Non_hosteler'
    TEACHER_QUARTER = 'Teacher_quarter'
    residence = ((FIRST, 'First'),(SECOND, 'Second'),(THIRD, 'Third'),(FOURTH, 'Fourth'),(NGH,'NGH'),(NON_HOSTELER, 'Non_hosteler'),(TEACHER_QUARTER,'Teacher_quarter'))
    residence = models.CharField(max_length=20,choices=residence,default=FIRST,)
    room_no=models.CharField(max_length=10,default = "000")

1 个答案:

答案 0 :(得分:0)

我想计算一下,您可以写出一个特定住所产生的投诉数量:

Complain.objects.values('complain_user__profile__residence').annotate(complains_count=Count('id'))

在您的SQL查询中:

SELECT users_profile.residence,count(user_id)from users_profile INNER JOIN chp_complain on(users_profile.user_id = chp_complain.complain_user_id)GROUP BY(user_id)

您计算有多少用户从特定住所提起投诉。可以计算如下:

User.objects.values('profile__residence').annotate(Count('id'))