Python 3.7.3
django 2.2.5
mysql 5.7.27
我的旧数据库中有4个表(无法触摸“资产”,“员工”和“分配”。我可以随意更改项目),这在这里很有趣:
- 资产
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.
- 员工
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.
- 任务
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.
- 物品
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
并没有描述Assets
和Employees
之间的唯一关联,而是保留了一条记录。例如,如果我将资产“ A”分配给员工“ X”,然后将其转移给员工“ Y”,它将在Assignment
表中创建一个新条目。因此,当前资产的最后一项是实际的当前分配。该数据库由两个不同的应用程序使用。一个处理旧表和所有操作,而另一个仅用于查询旧数据库并显示输出。
我曾考虑过这一点,但目前尚不知道如何解决。如果我从assignment
模型中删除Item
字段,则不知道如何在模板中显示表格以显示当前资产的所有者。如果我想要基于所有者的列表,我不知道会这样做。
我可以编写一种在每次显示页面时检查关联的方法,但是我认为如果有很多用户,这意味着查询过多。
任何建议将不胜感激。