Django - Admin - Defualt Add/Change Form

Мне интересно, какой лучший метод и как добавить информационное поле во встроенные формы добавления/изменения администратора.

Вот мой случай:

У меня есть 3 модели, каждая из которых связана с другой внешним ключом инвестор --> инвестиции распределение --> инвестиции

Таким образом, с помощью соответствующего запроса я могу легко найти в таблице распределения, какой инвестор получил какое распределение

Если я хочу добавить распределение с помощью встроенных форм администрирования Django - опция выбора поля "инвестиции" для формы добавления распределения в выпадающем списке будет включать все инвестиции. Проблема в том, что если у меня есть одинаковое имя инвестиции для двух инвесторов, я не знаю, какой вариант выбрать. Поэтому я бы хотел, чтобы форма искала инвестора с помощью Investment --> Investor во время добавления/изменения распределения, таким образом, когда я добавляю распределение к инвестициям, я могу выбрать, к какому инвестору оно относится.

и.д. Инвестор Пол имеет инвестиции AAPL, GME, BB Инвестор Алан имеет инвестиции TSLA, GME. Добавление распределения для инвестиций GME ---> эта форма должна содержать 2 опции GME, но я хотел бы знать, какая из них принадлежит Полу, а какая Алану

На главной странице администратора для дистрибутивов я вижу это, используя list_display и вставляя функцию для вызова поиска (код вставлен ниже), но мне нужна та же информация на форме добавления/изменения

models.py

class Distribution(models.Model):
    distribution_id = models.AutoField(primary_key=True)
    investment = models.ForeignKey('Investment', models.DO_NOTHING, blank=True, null=True)
    distribution_amount = models.DecimalField(max_digits=18, decimal_places=4, blank=True, null=True)
    distribution_date = models.DateField(blank=True, null=True)

    class Meta:
        db_table = 'distribution'

    def __str__(self):
        return f'{self.investment} for {self.distribution_amount}'


class Investment(models.Model):
    investment_id = models.AutoField(primary_key=True)
    investment_name = models.CharField(max_length=255, blank=True, null=True)
    initial_investment = models.DecimalField(max_digits=19, decimal_places=4, blank=True, null=True)
    date_of_investment = models.DateField(blank=True, null=True)
    investor = models.ForeignKey('Investor', models.DO_NOTHING, blank=True, null=True)

    class Meta:
        ordering = ('investment_name',)

    def __str__(self):
        return self.investment_name


class Investor(models.Model):
    investor_id = models.AutoField(primary_key=True)
    first_name = models.CharField(max_length=255, blank=True, null=True)
    last_name = models.CharField(max_length=255, blank=True, null=True)

    class Meta:
        ordering = ('last_name',)

    def __str__(self):
        return f'{self.last_name}, {self.first_name}'

admin.py

from django.contrib import admin

# Register your models here.
from .models import Distribution, Investment, Investor


@admin.register(Distribution)
class DistributionAdmin(admin.ModelAdmin):
    list_display = ('investment', 'get_investor' ,'distribution_amount')


    @admin.display(description='Investor Name')
    def get_investor(self, obj):
        return obj.investment.investor


@admin.register(Investment)
class InvestmentAdmin(admin.ModelAdmin):
    list_display = ('investment_name', 'investor')


@admin.register(Investor)
class InvestorAdmin(admin.ModelAdmin):
    list_display = ('full_name_display',)

    @admin.display(description='Investor Name')
    def full_name_display(self, obj):
        return f'{obj.last_name}, {obj.first_name}'
Вернуться на верх