Skip to main content
 首页 » 编程设计

python之在 Django 中访问反向关系

2025年05月04日36txw1958

模型.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) 

我想访问所有 Material 请求以及具有分配摘要的 Material 请求以创建表格。 例如,我有 5 个 Material 请求和 3 个分配摘要,我想要一个表格,其中有 5 行显示 Material 请求对象和相应分配对象的所有详细信息

像这样:

owner flow kit quantity platic_pallet side_wall top_lid Insert  
 1     1    1     1        1              1        1      1   
 2     2    2     2        2              2        2      2 
 3     3    3     3        3              3        3      3  
 4     4    4     4        -              -        -      -  
 5     5    5     5        -              -        -      - 

View .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}) 

请您参考如下方法:

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

因为您在 MaterialRequest 的 ForeignKey 中添加了一个 related_name,所以每个 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 是 Material 请求的分配 list 的所有 platic_pallet 值的总和/平均值?

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