Django中的关系-如何过滤数据

kuhbmx9i  于 2022-12-20  发布在  Go
关注(0)|答案(1)|浏览(176)

我看过很多条目,知道如何过滤简单的关系。
不幸的是,我被卡住了,当其中一个表是某个字符串的分支时,我不知道如何过滤表数据。
models.py

from django.contrib.auth.models import User

class Autor(models.Model):
   user = models.OneToOneField(User, on_delete=models.CASCADE, unique=True)
   description = models.TextField(blank=True, null=True)

class Incident(models.Model):
   group_no = models.ForeignKey(Group, on_delete=models.CASCADE, default=1)
   description = models.TextField(blank=True, null=True)
   deleted = models.BooleanField(default=False)

class Department-leader(models.Model):
   user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="leader")
   department = models.ForeignKey(Group, on_delete=models.CASCADE)

class Group(models.Model):
   group_no = models.CharField(max_length=40, unique=True)
   active = models.BooleanField(default=True)

views.py

def get_author(user):
    qs = Autor.objects.filter(user=user)
    if qs.exists():
        return qs[0]
    return None

def show_all(request):
    show_all_records = Incident.objects.filter(deleted=False).order_by('-id')[:300]

    if request.user.is_authenticated:
        autors_list = get_author(request.user)
        user_list = get_user_model()
        logged_user = get_object_or_404(user_list, username__exact=autors_list)
        
        (...)
        
        print("Logged user: " + str(logged_user.id))
    else:
        logged_user = ""

    context = {
        'show_all_records': show_all_records,
        'logged_user': logged_user,
    }

    return render(request, 'incident/all_records.html', context)

***show_all_records***变量表示***Incident***表中的所有记录,这是可以的。

我想显示的第二件事是登录人员的条目,即登录领导的特定部门中的所有事件。

如果这些表是线性连接的,那么构建这个过滤器就没有问题了。
但是如何为这种表布局制作筛选器呢?
在纯SQL中,它看起来像这样:

select 
    bledy_bledy.nr_zlecenia,
    bledy_bledy.ilosc_bledow,
    bledy_gruparobocza.nr_grupy,
    auth_user.username,
    auth_user.id
from 
    bledy_bledy 
LEFT JOIN 
    bledy_lider_dzial
on
    bledy_bledy.nr_grupy_roboczej_id = bledy_lider_dzial.dzial_id
LEFT JOIN 
    bledy_gruparobocza
on
    bledy_lider_dzial.dzial_id = bledy_gruparobocza.id
LEFT JOIN 
    auth_user
on
    bledy_lider_dzial.user_id = auth_user.id
where
    auth_user.id = 4

我能指望一些关于如何构建它的提示吗

afdcj2ne

afdcj2ne1#

我想这可能是你想要的。

user = request.user

# only need the primary keys of the group leaders for the next query
department_ids = user.leader.all().values_list('department_id', flat=True)

incidents = Incident.objects.filter( group_no_id__in= departments )

还有一个建议:遵循Django命名外键和相关名称的约定。leaders而不是leader(因为它引用了多个或一组前导),group而不是group_no,因为它引用了Group对象。(实际的FK/主键值是通过将_id附加到字段名来获得的,如上文所用。这是Django的“魔术”。)

相关问题