Python 如何筛选这两种模型之间的差异?使用django

Python 如何筛选这两种模型之间的差异?使用django,python,django,Python,Django,我有两个模型,Product和ProductRelatedGroupAndProduct,ProductRelatedGroupAndProduct有5个数据,[chicken,okra,ampalaya,colla],而ProductRelatedGroupAndProduct有[chicken,okra,colla]如何获取产品中ProductRelatedGroupAndProduct中没有的剩余数据 所选产品为ProductRelatedGroupAndProduct,产品列表为pro

我有两个模型,ProductProductRelatedGroupAndProductProductRelatedGroupAndProduct有5个数据,[chicken,okra,ampalaya,colla],而ProductRelatedGroupAndProduct有[chicken,okra,colla]如何获取产品中ProductRelatedGroupAndProduct中没有的剩余数据

所选产品为ProductRelatedGroupAndProduct,产品列表为product

我只希望choosen产品上显示的数据在产品列表中不再可见

到目前为止,这是我的观点

def searchrelatedproduct(request):
    id = request.GET.get('relatedproductID')
    products = Product.objects.all()
    relatedproduct = ProductRelatedGroupAndProduct.objects.filter(productrelatedgroup = id)
    return render(request, "customAdmin/relatedproduct.html",{"products":products,"relatedproduct":relatedproduct})
这是我的html

<div class="container">
    <form method="POST" action="/GroupOfProduct/" enctype="multipart/form-data">{% csrf_token %}
  <h2>Product </h2>
    <div class="form-group">
      <br>
      <label for="sel2">List Of Products</label>
            <select multiple class="form-control" id="sel2" name="product">
                {% for product in products %}
                    <option>{{product.product}}</option>
                {% endfor %}
            </select>
    </div>
      <input type="submit" style="float:right;">
  </form>
</div>


<div class="container">
  <h2>Choosen Product</h2>
  <form method="POST" action="/UpdateGroupOfProduct/" enctype="multipart/form-data">{% csrf_token %}
      <input type="submit" style="float:right;">
    <div class="form-group">
      <br>
      <label for="sel2">List Of Choosen Products</label>
        <select multiple class="form-control" id="sel2" name="relatedproduct">
          {% for product in relatedproduct %}

            <option value="{{ product.id }}">{{product.product}}</option>
          {% endfor %}
        </select>
    </div>

  </form>
</div>
更新

当我尝试这个的时候

diffproducts = products.exclude(pk__in=relatedproduct)
print(diffproducts)
unused_product = set(relatedproduct).difference(set(products))
print(unused_product)

***result***
{<ProductRelatedGroupAndProduct: cabbage>, <ProductRelatedGroupAndProduct: ampalaya>, <ProductRelatedGroupAndProduct: okra>}

它打印产品的所有数据

<QuerySet [<Product: cabbage>, <Product: ampalaya>, <Product: okra>, <Product: Chicken>]>
我得到这个错误

django.core.exceptions.FieldError: Cannot resolve keyword 'productrelatedgroupandproduct' into field
您可以使用以下选项进行筛选:

Product.objects.filter(productrelatedgroupandproduct__isnull=True)

productrelatedgroupandproduct
这里是
productrelatedgroupandproduct
模型的小写名称。这是参数的默认值。

这可以通过将查询集转换为集合,然后对复杂情况使用交集来实现

# get objects present in both
set(products).intersection(set(relatedproduct))


# get product not in relatedproduct
set(products).difference(set(relatedproduct))


# opposite
set(relatedproduct).difference(set(products))
在您的情况下,
exclude
可以实现以下功能:
products.exclude(pk\uu in=relatedproduct)
您可以使用exclude功能:

views.py:

def searchrelatedproduct(request):
    id = request.GET.get('relatedproductID')
    products = Product.objects.all()
    relatedproduct = ProductRelatedGroupAndProduct.objects.filter(pk=id)
    diffproducts = products.exclude(pk__in=relatedproduct)

    return render(request, "test.html",{"products":diffproducts,"relatedproduct":relatedproduct})

并以原始html格式在模板中输出。

共享您的模型。py.好的,请wait@djangotic检查我更新的问题我尝试了这个,但我得到了这个结果******@justin你确定你做了
Product.objects.filter(productrelatedgroupandproduct\uu isnull=True)
?因为它返回
Product
对象的Queryset。但您说它返回
ProductRelatedGroupAndProduct
.django.core.exceptions.FieldError:无法将关键字“ProductRelatedGroupAndProduct”解析为我的产品模型中的字段,我没有外国钥匙ProductRelatedGroupAndProduct@justin但是,由于在
ProductRelatedGroupAndProduct
中有
Product
的外键,因此可以使用
ProductRelatedGroupAndProduct
筛选
产品。检查我的答案中的链接。至于
无法解析关键字“productrelatedgroupandproduct”
您是否显示了实际代码?可能模型有不同的名称?它像查询集一样打印所有数据。用htmlit更新我的答案打印所有数据,答案更新。您的测试的url是什么?你通过了relatedproductId吗?我发布了我的完整模型。请检查我更新的问题我如何使用集合(relatedproduct)。差异(集合(products))?在你的
searchrelatedproduct
中,例如:
unused\u product=set(relatedproduct)。差异(集合(products))
,然后像对待产品一样在返回中通过它。然后循环,然后在模板中打印所有数据
# get objects present in both
set(products).intersection(set(relatedproduct))


# get product not in relatedproduct
set(products).difference(set(relatedproduct))


# opposite
set(relatedproduct).difference(set(products))
def searchrelatedproduct(request):
    id = request.GET.get('relatedproductID')
    products = Product.objects.all()
    relatedproduct = ProductRelatedGroupAndProduct.objects.filter(pk=id)
    diffproducts = products.exclude(pk__in=relatedproduct)

    return render(request, "test.html",{"products":diffproducts,"relatedproduct":relatedproduct})