Django Mptt: Как вложить другую модель - PullRequest
0 голосов
/ 07 мая 2020

У меня две модели: реселлер и покупатель. Я могу сгенерировать древовидную иерархию для торгового посредника, но я хочу перечислить клиентов под их непосредственным родительским торговым посредником.

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

1 Ответ

1 голос
/ 07 мая 2020

Причина, по которой это не работает, заключается в том, что клиенты не входят в дерево торговых посредников, их нужно получать вручную. Что-то вроде этого даст вам начало: Если клиенты не всегда находятся на ведущем узле, вам необходимо внести некоторые изменения.

{% recursetree resellers %}
  <li>
    {{ node.reseller_name }}
    {% if node.cust_children.all %}
      <ul>
        {% for customer in node.cust_children.all %}
          <li>{{ customer.customer_name }}</li>
        {% endfor %}
      </ul>
    {% endif %}
    {% if not node.is_leaf_node %}
      <ul class="children">
        {{ children }}
      </ul>
    {% endif %}
  </li>
{% endrecursetree %}
...