Сравнение значений из двух моделей в Django DetailView - PullRequest
0 голосов
/ 12 февраля 2020

Итак, я пытаюсь создать автоматизированный «тиковый лист» в качестве подтверждения концепции для предложения по автоматизации процесса на моем рабочем месте.

На работе мы получаем заказы от различных поставщиков и нам необходимо вручную отметьте все полученные заказы в списке ожидаемых на листе бумаги каждый день.

Я использую обобщенный c DetailView, чтобы иметь отдельную страницу для каждого Розничного продавца и иметь модель, представляющая Розничного продавца с отношениями ManyToMany с Поставщиками. У меня также есть модель Порядка, чтобы «имитировать» соединение с реальной базой данных WMS (с намерением изменить его после получения фактического доступа к БД для чтения, если / когда он будет запущен в производство.)

Мне нужно ожидаемое заказы (в отношении Suppliers ManyToMany) для сопоставления с данными в «реальных» данных модели заказа и возврата ответа о том, существует ли он в БД (таким образом, чтобы я мог отобразить его в шаблоне).

После нескольких попыток Франти c решить ее самостоятельно, я немного озадачен тем, как этого добиться в контексте DetailView, поэтому я боюсь, что что-то неправильно понимаю ...

редактировать: я должен был упомянуть, что мне нужен только «код поставщика» для сопоставления, но я также хотел бы, чтобы программа проверила дубликаты заказов, используя «ссылку на заказ», как только я понял это, так как без этой функциональности все становится немного избыточно ...

Мои модели.py:

from django.db import models
from django.utils import timezone


class Order(models.Model):

    ''' To simulate connection to main stock db '''

    retailer_code = models.CharField(max_length=4)
    retailer_name = models.CharField(max_length=100)
    supplier_code = models.CharField(max_length=4)
    supplier_name = models.CharField(max_length=100)
    order_reference = models.CharField(max_length=20)
    despatch_date = models.DateTimeField(default=timezone.now)

    def __str__(self):

        return f"< {self.order_reference}', {self.supplier_name}, {self.retailer_name} >"


# -------------------------------------------------------------------------------------

class Retailer(models.Model):

    retailer_code = models.CharField(max_length=4)
    retailer_name = models.CharField(max_length=100)
    suppliers = models.ManyToManyField('Supplier')
    slug = models.SlugField(unique=True, null=True)

    def get_supplier_values(self):

        return [(suppliers.supplier_code + ' - ' + suppliers.supplier_name) for suppliers in self.suppliers.all()]

    def save(self, *args, **kwargs):

        self.slug = self.slug or slugify(self.retailer_code)
        super().save(*args, **kwargs)    


    def __str__(self):

        return f"< {self.retailer_code} - {self.retailer_name} >"


class Supplier(models.Model):

    supplier_code = models.CharField(max_length=4)
    supplier_name = models.CharField(max_length=100)

    def __str__(self):

        return f"< {self.supplier_code}, {self.supplier_name} >"

Мои просмотры.py:

from django.shortcuts import render
from django.views.generic.list import ListView
from django.views.generic.detail import DetailView
from .models import Retailer, Order


class RetailerListView(ListView):

    model = Retailer
    context_object_name = 'retailer_list'

    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)
        context['title'] = 'Select Retailer'

        return context

class RetailerDetailView(DetailView):

    model = Retailer
    slug_field = 'retailer_code'
    slug_url_kwarg = 'retailer_code'

    def get_context_data(self, **kwargs):

        context = super().get_context_data(**kwargs)
        context['title'] = 'Order Checklist'
        context['db_orders'] = Order.objects.filter(retailer_code=self.object.retailer_code)       

        return context

    def do_order_checklist(self):

        pass # WIP

Любая помощь будет подтверждена eciated ...

Ответы [ 2 ]

0 голосов
/ 12 февраля 2020

Возможно, вы можете использовать Exists, чтобы комментировать, если заказ находится в БД. Например:

from django.db.models import Exists, OuterRef
...

def get_context_data(self, **kwargs):
    context = super().get_context_data(**kwargs)
    context['title'] = 'Order Checklist'
    squery=self.object.suppliers.filter(supplier_code=OuterRef('supplier_code'))
    context['db_orders'] = Order.objects.filter(
            retailer_code=self.object.retailer_code
        ).annotate(
            in_db=Exists(squery)
        )
    return context

Затем показать в шаблоне:

{% for item in db_orders %}
   {% if item.in_db %}
       // do something
   {% else %}
       // else
   {% endif %}
{% endfor %}
0 голосов
/ 12 февраля 2020

Понятно, возможно, вы ищете ответ. как вы получите список поставщиков_кодов в каждом магазине. Например, у вас уже есть список.
retailers_supplier_codes = [1, 2, 3, ...]
matching_orders = Order.objects.filter(supplier_code__in = retailers_supplier_codes)

...