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

2024-06-02 16:35:13 发布

您现在位置:Python中文网/ 问答频道 /正文

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

enter image description here

选择的产品是产品相关组和产品,产品列表是产品

我只希望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>

这是我的模特

class ProductRelatedGroupAndProduct(models.Model):
    product = models.ForeignKey(Product,on_delete=models.SET_NULL, null=True,blank=True,verbose_name="Product")
   productrelatedgroup = models.ForeignKey('ProductGroup',
                            on_delete=models.SET_NULL, null=True, blank=True,
                            verbose_name="ProductGroup")
class Product(models.Model):
    product = models.CharField(max_length=500)


class ProductGroup(models.Model):

    category = models.CharField(max_length=500, blank=True)

更新

当我尝试这个的时候

diffproducts = products.exclude(pk__in=relatedproduct)
print(diffproducts)

它打印产品的所有数据

<QuerySet [<Product: cabbage>, <Product: ampalaya>, <Product: okra>, <Product: Chicken>]>

当我尝试这个的时候

unused_product = set(relatedproduct).difference(set(products))
print(unused_product)

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

还有这个

Product.objects.filter(productrelatedgroupandproduct__isnull=True)

我得到这个错误

django.core.exceptions.FieldError: Cannot resolve keyword 'productrelatedgroupandproduct' into field

Tags: 数据divformidtrue产品modelsh2
3条回答

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

# 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__in=relatedproduct)

您可以使用reverse relation作为筛选器:

Product.objects.filter(productrelatedgroupandproduct__isnull=True)

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

您可以使用排除功能:

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格式在模板中输出

相关问题 更多 >