djang中的访问反向关系

2024-06-27 02:26:30 发布

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

在模型.py在

class MaterialRequest(models.Model):
    owner = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='allotment_sales')
    flow = models.ForeignKey(Flow, on_delete=models.CASCADE, related_name='flow')
    kit = models.ForeignKey(Kit, on_delete=models.CASCADE, related_name='kit')
    quantity = models.IntegerField(default=0)
    is_allocated = models.BooleanField(default=False)

class AllotmentDocket(models.Model):

    transaction_date = models.DateField(default=datetime.now)
    dispatch_date = models.DateField(default=datetime.now)
    sales_order = models.ForeignKey(MaterialRequest, on_delete=models.CASCADE, related_name='allotment_sales')
    parent_company = models.ForeignKey(Client, on_delete=models.CASCADE, related_name='allotment_parent')

    plastic_pallet = models.IntegerField(default=0)
    side_wall = models.IntegerField(default=0)
    top_lid = models.IntegerField(default=0)
    insert = models.IntegerField(default=0)
    separator_sheet = models.IntegerField(default=0)

我想访问所有的材料请求以及那些有分配记录的创建一个表。 例如,我有5个物料申请和3个分配摘要,我想要一个表,其中有5行显示物料请求对象和相应分配对象的所有详细信息

像这样:

^{pr2}$

在视图.py在

def mat_details(request):
    value = request.POST['my-select']
    start = request.POST['from']
    end = request.POST['to']

    client_pk = Client.objects.filter(client_name = value)[0]

    mat_req = MaterialRequest.objects.filter(owner = client_pk.pk, created_on__range =[start, end] )

    return render(request, 'packsapp/employee/matdeatils.html', {'query': mat_req})

Tags: nameclientdefaultonmodelsrequestdeletecascade
2条回答

正如Iulia在另一个答案中所说,MaterialRequest和{}之间的关系是外键,意味着一个{}可以有多个{}。如果发生这种情况,那么可以使用^{}在单个查询中使用^{}从反向关系中求出{}、side_wall,top_lidinsert的值。例如:

from django.db.models import Sum

client_pk = Client.objects.filter(client_name = value)[0]
mat_req = MaterialRequest.objects.filter(
    owner=client_pk.pk,
    created_on__range=[start, end]
).annotate(
    plastic_pallet=Sum('allotment_parent__plastic_pallet')
).annotate(
    side_wall=Sum('allotment_parent__side_wall')
).annotate(
    top_lid=Sum('allotment_parent__top_lid')
).annotate(
    insert=Sum('allotment_parent__insert')
)

并在模板中使用:

^{pr2}$

顺便说一句(或者可能不相关),如果MaterialRequest和{}之间存在{a3}关系,那么您只需在模板中使用{{ i.allotment_parent.side_wall }}来获取{}信息。在

两个表有一对多关系,这意味着一个MaterialRequest条目可以有多个对应的AllotmentDocket条目。在

因为您将一个related_name添加到ForeignKeyMaterialRequest,所以每个MaterialRequest对象都有一个名为allotment_sales的属性,它是检索和操作与当前MaterialRequest相关的所有AllotmentDocket对象的方法。在

尝试在Django shell中执行以下操作:

>>> material_request = MaterialRequest.objects.first()
>>> material_request.allotment_sales.count()
>>> material_request.allotment_sales.all()
>>> material_request.allotment_sales.first()

你可以阅读更多关于这个here。在

关于您要显示的表,如果每一行都是MaterialRequest记录,那么AllotmentDocket中的列应该如何计算?它们是否聚合在一起,例如platic_pallet是物料请求的分配摘要的所有platic_pallet值的总和/平均值?在

如果您正在考虑一个表显示,也许您应该让每一行代表一个AllotmentDocket对象,即一对多关系中的“多”部分。在

相关问题 更多 >