Рекомендации по обратному доступу для внешнего ключа в Django admin list_display - PullRequest
0 голосов
/ 28 марта 2020

У меня есть приложение django, клиенты которого делают онлайн-заказы, а затем мы отправляем их по почте. Для заказов и почтовых посылок я определил две модели, у которых постпакет имеет поле заказа в качестве внешнего ключа для модели заказов. Я поставил list_per_page = 250. Теперь у меня есть около 100 000 заказов в моей базе данных postgresql. Все также проиндексировано. В admin.py мне нужно было получить доступ к штрих-коду для каждого постпарка, когда я просматривал модель заказа в админ-панели. Поэтому я сделал функцию для запроса. Однако, когда я использую панель инструментов администратора Django, я вижу 250 запросов на получение всех результатов из таблицы postparcel. Это трудоемкий процесс. Что является лучшей практикой для этого. Я попытался использовать PostParcel__parcel_post_barcode и PostPacel.parce_post_barcode .. Оба имеют ошибку компиляции, говоря, что этот объект не найден в этом классе. Пожалуйста, дайте мне знать, как я могу объединить эти две таблицы в один запрос и ускорить его в моей административной панели.

Я нашел здесь фрагмент кода, но он кажется старым. Я использую django 3.1. Я думаю, что должен быть лучший способ. https://djangosnippets.org/snippets/2887/

models.py

class Orders(models.Model):

    order_id = models.CharField(max_length=255, null=True, unique=True, verbose_name=_("order id"))
    creation_time = models.DateTimeField(auto_now_add=True, verbose_name=_("creation time"))
    modification_time = models.DateTimeField(auto_now=True, verbose_name=_("modification time"))
    total_price = models.DecimalField(decimal_places=2, max_digits=20, default=0, verbose_name=_("total price"))

class PostParcel(models.Model):

    parcel_id = models.CharField(max_length=255, null=True, unique=True, verbose_name=_("parcel id"))
    parcel_post_barcode = models.CharField(max_length=24, null=True, unique=True, verbose_name=_("parcel barcode"))
    order = models.ForeignKey(Orders, related_name='orders', verbose_name=_("order"),on_delete=models.CASCADE)

admin.py

class OrdersAdmin(admin.ModelAdmin):

    list_display = ['order_id', 'creation_time', 'total_price','parcel_barcode']
    list_per_page=250

    def parce_barcode(self, obj):
        return PostParcel.objects.get(order_id=obj.pk).parcel_post_barcode
...