如果只有另一个模型的字段包含某个值并且这两个模型具有外键,我如何过滤模型的对象
Posted
技术标签:
【中文标题】如果只有另一个模型的字段包含某个值并且这两个模型具有外键,我如何过滤模型的对象【英文标题】:how can i filter the objects of a model if only the field of another model contains a certain value and these two models have foreign keys 【发布时间】:2019-07-24 20:28:21 【问题描述】:我有两个模型:模型订单
class Order(models.Model):
truck = models.ForeignKey(Truck, on_delete=models.CASCADE, related_name='relation_truck',default=None)
date= models.DateField()
product=models.CharField(max_length=30)
depot = models.CharField(max_length=10)
volume = models.CharField(max_length=30, blank=True)
volume_delivered = models.CharField(max_length=30, blank=True)
order_status = models.CharField(max_length=50, blank=True)
pub_date = models.DateTimeField(auto_now_add=True, blank=True)
还有另一个模型加载模型:
class Loaded(models.Model):
order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name='relation_order',default=None)
status = models.CharField(max_length=50, blank=True)
我想在视图中使用模型 Order
中的模型 order_status=Released
和 order_status=Released
和 Loaded
归档对象,因为我有外键顺序。
在我看来,我有类似的东西:
def loading(request):
loaded = Loaded.objects.filter(order__order_status__in=['Loaded', 'Released'])
return render(request, 'loadings.html' , 'loaded':loaded)
在我的 html 中:
<table id="datatable2" class="table order-column hover">
<thead>
<tr>
<th>Truck NO.</th>
<th>Date</th>
<th>Product</th>
<th>Volume</th>
<th>Volume @20</th>
<th>Depot</th>
<th>Driver</th>
<th>Driver Tel</th>
<th>Driver ID</th>
<th>Status</th>
</tr>
</thead>
<tbody>
% for car in loaded %
<tr class="gradeX">
<td>car.order.truck.truck_number</td>
<td>car.order.date</td>
<td>car.order.product</td>
<td>car.order.volume</td>
<td>car.order.volume_delivered</td>
<td>car.order.depot</td>
<td>car.order.truck.driver_name</td>
<td>car.order.truck.driver_phone_number</td>
<td>car.order.truck.driver_id_number</td>
<td><input type="checkbox" id="toggle-two"></td>
</tr>
% endfor %
</tbody>
</table>
我想要的是 order_status 加载和接收的订单仅显示在我的 loadings.html 中
【问题讨论】:
嘿@MANKA MEHDI,你可以使用类似:Loaded.objects.filter(order__order_status='Loaded')
请看这里:***.com/questions/13092268/…
How do you join two tables on a foreign key field using django ORM?的可能重复
@PhilippZettl 没用
@theBuzzyCoder 你能帮我了解如何使用 prefetch_related 和 select_related 不知何故我感到困惑,他们给了我错误
【参考方案1】:
试试这个:
loaded_or_released = Loaded.objects.filter(Q(order__order_status='Loaded') | Q(order__order_status='Released') )[0:200]
【讨论】:
【参考方案2】:首先让我解释一下这个问题,以便我可以确保我已经正确理解了这个问题!
订单有国外卡车 加载有国外订单这意味着1
订单可以有n
加载的项目。
您希望所有已加载的项目在Loaded
或Released
中具有order_status。
Django one-to-many relationship lookup
如果这是你想要达到的,那么
all_loaded_items = Loaded.objects.filter(order__order_status__in=['Loaded', 'Released'])
在通过__
拆分参数名称后的过滤器参数中
order
是外域
order_status
是外域中的域
in
是类似mysql的in运算符的运算符
其中 all_loaded_items 是 QuerySet 类型。
【讨论】:
能否请您查看我已编辑并进一步解释的问题。 在views.py中将import pdb; pdb.set_trace()
放在def loading(request):
之后。然后在终端中执行python manage.py runserver
并加载页面。回到终端,manage.py 将显示提示符(pdb)
。输入n
并输入。然后它将执行您的下一行并给出提示。然后,输入print(loaded)
看看结果如何。这就是你调试的方式。
我得到的查询集是空的:(Pdb) print(loaded) (Pdb) select * from order as o join loaded as l on l.order_id=o.id where o.order_status in ('Released', 'Loaded');
。看看有没有输出。还要知道你的表名是什么,请在 mysql/mariadb 中使用 show tables;
。以上是关于如果只有另一个模型的字段包含某个值并且这两个模型具有外键,我如何过滤模型的对象的主要内容,如果未能解决你的问题,请参考以下文章
姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?