【发布时间】:2020-05-07 09:43:08
【问题描述】:
我有两个模型,经销商和客户。我可以为经销商生成树层次结构,但我想在其直接父经销商下列出客户。
models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey
# Create your models here.
class Reseller(MPTTModel):
reseller_name = models.CharField(max_length=40)
reseller_email = models.EmailField(max_length=70,blank=True)
reseller_code = models.CharField(max_length=40)
parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')
class MPTTMeta:
order_insertion_by = ['reseller_name']
def __str__(self):
return self.reseller_name
class Customer(models.Model):
customer_name = models.CharField(max_length=40)
customer_email = models.EmailField(max_length=70,blank=True)
customer_code = models.CharField(max_length=40)
reseller = models.ForeignKey(Reseller, on_delete=models.CASCADE, null=True, blank=True, related_name='cust_children')
def __str__(self):
return self.customer_name
这是视图:
views.py
from django.shortcuts import render, redirect
from django.http import HttpResponse
from .models import *
from .forms import *
# Create your views here.
def index(request):
return render(request, 'main/login.html')
def home(request):
resellers = Reseller.objects.all()
customers = Customer.objects.all()
context = { 'resellers' : resellers, 'customers' : customers }
return render(request, 'main/home.html', context)
这是在 mptt 文档中引用的递归树标记。 主页.html
{% recursetree resellers %}
<li>
{{ node.reseller_name }}
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
这是我的目标顺序:
reseller1
-reseller2
-customer1
--reseller3
----customer2
【问题讨论】:
-
我不确定我是否遵循。你所拥有的有什么问题?它应该按原样工作,只需将
Customer.parent设置为您想要的Reseller对象。顺便说一句,这里的Customer中的 parent 不是一个好名字,最好直接称呼它为reseller。 -
Tom,感谢您的回复,我将父级更改为客户中的经销商。当我运行 ``` recursettree ``` 标签时,我无法在经销商下显示客户。它只提供经销商的层次结构。我应该从视图函数中传递什么查询来获取经销商下的所有客户。
-
是的,因为它不是树的一部分。如果您显示您拥有的递归树代码,则可以使用它提供解决方案。
-
Tom,刚刚在我的视图中添加了视图和递归标签。
-
顺便说一句,不要使用
import *,它会让人无法知道事情的来源,并且会破坏编辑器中的代码完成和其他功能,以及引入细微的错误.
标签: django django-mptt