如果只有另一个模型的字段包含某个值并且这两个模型具有外键,我如何过滤模型的对象

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=Releasedorder_status=ReleasedLoaded 归档对象,因为我有外键顺序。

在我看来,我有类似的东西:

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 加载的项目。

您希望所有已加载的项目在LoadedReleased 中具有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) 所以,这就是你的答案。首先看看你的表中是否有数据。假设您使用的是 SQL/MySQL/Mariadb,请运行此 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;

以上是关于如果只有另一个模型的字段包含某个值并且这两个模型具有外键,我如何过滤模型的对象的主要内容,如果未能解决你的问题,请参考以下文章

Django 模型字段依赖于另一个模型字段

姜戈初学者。如何更新所有对象并将某个字段设置为另一个字段的函数值?

Django 模型字段默认为 Null

两个外键字段,正好一个被设置为一个值,另一个在 MySQL 数据库的 django 模型中为空

怎么根据一个表的字段值修改另一个表的字段值

在 Qt 中使用不同模型访问另一个列表视图的委托中的列表视图模型数据