动态查询数据库并输出过滤后的结果

Python 3.7.3

django 2.2.5

mysql 5.7.27

我的旧数据库中有4个表(无法触摸“资产”,“员工”和“分配”。我可以随意更改项目),这在这里很有趣:

  1. 资产
class Assets(models.Model):
    id = models.AutoField(db_column='Id',primary_key=True)
    assettag = models.CharField(db_column='AssetTag',unique=True,max_length=10)
    assettype = models.CharField(db_column='AssetType',max_length=150)
.........
    etc.
  1. 员工
class Employees(models.Model):
    id = models.AutoField(db_column='Id',primary_key=True)  # Field name made lowercase.
    loginname = models.CharField(db_column='LoginName',max_length=30,blank=True,null=True)
    userpass = models.CharField(db_column='UserPass',null=True)
    lastname = models.CharField(db_column='LastName',max_length=50,null=True)
    firstname = models.CharField(db_column='FirstName',null=True)
.........
    etc.
  1. 任务
class Assignments(models.Model):
    employeeid = models.ForeignKey('Employees',db_column='EmployeeId',default=0,null=True,on_delete=models.SET_DEFAULT)
    assetid = models.ForeignKey('Assets',db_column='AssetId',on_delete=models.SET_DEFAULT)
.........
    etc.
  1. 物品
class Item(models.Model):
    rfid_tag    = models.CharField(max_length=24,default='',help_text="Only HEX characters allowed",)
    asset       = models.OneToOneField('Assets',default=None,on_delete=models.SET_DEFAULT,)
    date        = models.DateTimeField(name='timestamp',auto_now_add=True,)
    assignment = models.ForeignKey('Assignments',)

现在,我有一个看起来像这样的视图:

class IndexView(generic.ListView):
    template_name = template
    context_object_name = 'item_list'

    def get_context_data(self,**kwargs):
        # call the base implementation
        context = super().get_context_data(**kwargs)
        # Add own context information
        context['count'] = Item.objects.count()
        context['employee'] = Employees.objects.filter(loginname = self.request.user.username)
        return context

    def get_queryset(self):
        query = self.request.GET.get('q')                                       
        if query:                                                               
            return Item.objects.filter(
Q(asset__assettag__icontains = query) |
Q(rfid_tag__icontains = query) |
Q(assignment__employeeid__loginname__icontains = query) |
Q(assignment__employeeid__firstname__icontains=query) |
Q(assignment__employeeid__lastname__icontains=query)
                                       ).order_by('asset__assettag')
        else:                                                                  
            return Item.objects.all()

还有类似的模板:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Inventory</title>
</head>
<body>
    {% extends "pages/base.html" %}
    {% block content %}
        <div>
            <form method="GET" action=".">
                <input type="text" name="q" placeholder="Search inventory" value="{{ request.GET.q }}"/>
                <input type="submit" class="btn btn-sm btn-info" value="Search"/>
            </form>
        </div>

        <br>
        <p>Total number of items: {{count}}</p>

        <table border="2">
            <tr>
                <th>No.</th>
                <th>RFID Tag</th>
                <th>AssetTag</th>
                <th>Owner</th>
                <th>Description</th>
                <th></th>
            </tr>
            {% for item in item_list %}
            <tr>
                <td>{{forloop.counter}}</td>
                <td> {{ item.rfid_tag }}</td>
                <td><a href = "{% url 'inventory:detail' item.asset.assettag %}"><strong>{{ item.asset.assettag }}</strong></a></td>
                <td>{{item.assignment.employeeid.firstname}} {{item.assignment.employeeid.lastname}}</td>
                <td>{{item.asset.description}}</td>
                <td>
                    <a href="{% url 'inventory:remove' item.asset.assettag %}" class="btn btn-sm btn-outline-primary py-0" role="button">Delete</a>
                </td>
            </tr>
            {% endfor %}
        </table>
    {% endblock %}
</body>
</html>

在当前表单中,Item表具有对Assignments表的引用,因此,每次创建新条目时,我都会从Assignments中获取最后一个并将其设置为ForiegnKey。就像上面get_queryset方法中看到的那样,这使我可以快速便捷地进行过滤。我可以通过过滤Item查询集来基于Employee进行显示和搜索。

到目前为止,一切都很好,一切都按照我想要的方式工作。除了Assignments并没有描述AssetsEmployees之间的唯一关联,而是保留了一条记录。例如,如果我将资产“ A”分配给员工“ X”,然后将其转移给员工“ Y”,它将在Assignment表中创建一个新条目。因此,当前资产的最后一项是实际的当前分配。该数据库由两个不同的应用程序使用。一个处理旧表和所有操作,而另一个仅用于查询旧数据库并显示输出。

我曾考虑过这一点,但目前尚不知道如何解决。如果我从assignment模型中删除Item字段,则不知道如何在模板中显示表格以显示当前资产的所有者。如果我想要基于所有者的列表,我不知道会这样做。

我可以编写一种在每次显示页面时检查关联的方法,但是我认为如果有很多用户,这意味着查询过多。

任何建议将不胜感激。

oye07 回答:动态查询数据库并输出过滤后的结果

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3166157.html

大家都在问