Nano Hash - криптовалюты, майнинг, программирование

Показать сложный объект в интерфейсе администратора Django

Я застрял, пытаясь понять, как сделать следующее:

У меня есть несколько сущностей:

PurchaseItem (товар в корзине пользователя), Order (заказ — объединяет один или несколько PurchaseItems), OrderStatusHistory (это элементы статуса для Order — вместо того, чтобы изменять, я создаю новые, чтобы иметь возможность ретроспективно просмотреть, как статус изменился с течением времени) .

Я не хочу, чтобы что-то из этого создавалось через админку — все они создаются через публичный интерфейс, но мне нужно показать Орден и его атрибуты в админке:

Мне нужно иметь возможность показать список заказов. Это просто.

Когда я нажимаю на заказ или что-то еще, я хочу иметь возможность просматривать детали заказа: список предметов покупки.

Мне нужно иметь возможность изменить статус заказа - выбрать из раскрывающегося списка или что-то в этом роде - однако это действие вызывает создание нового элемента statusHistory.

Возможно ли все это с интерфейсом администратора или я должен забыть об этом и создать свою собственную реализацию со страницами и всем остальным?

Мои модели выглядят так:

class Order(models.Model):
    dateCreated = models.DateTimeField(null=False,default=datetime.now())
    items = models.ManyToManyField(PurchaseItem)
    user_name = models.CharField(null=True,blank=True,max_length=200)
    phone = models.CharField(null=False,blank=False,max_length=11,validators=[validate_phone])
    phone_ext = models.CharField(null=True,blank=True,max_length=5,validators=[validate_phone_ext])
    email = models.CharField(null=False,blank=False,max_length=100,validators=[validators.EmailValidator])
    addressCity = models.CharField(null=False,blank=False,max_length=100)
    addressStreet = models.CharField(null=False,blank=False,max_length=200)
    notes = models.TextField(null=True,blank=True)
    accessKey = models.CharField(max_length=32,default=CreateAccessKey())

class PurchaseItem(models.Model):
    picture = models.ForeignKey(Picture, null=False)
    paperType = models.CharField(null=False,max_length=200)
    printSize = models.CharField(null=False,max_length=200)
    quantity = models.IntegerField(default=1, validators=[validators.MinValueValidator(1)])
    price = models.DecimalField(decimal_places=2,max_digits=8)
    dateCreated = models.DateTimeField(null=False)
    cost = models.DecimalField(decimal_places=2,max_digits=8)

class OrderStatusHistory(models.Model):
    orderId = models.ForeignKey(Order)
    dateSet = models.DateTimeField(null=False,default=datetime.now())
    status = models.IntegerField(choices=OrderStatus,default=0,null=False,blank=False)
    comment = models.TextField(null=True,blank=True)  

Следующая встроенная настройка не работает, потому что у заказа нет FK для PurchaseItems:

class OrderStatusHistoryAdmin(admin.StackedInline):
    model = OrderStatusHistory

class PurchaseItemAdmin(admin.StackedInline):
    model = PurchaseItem

class OrderAdmin(admin.ModelAdmin):
    model = Order
    inlines = [OrderStatusHistoryAdmin,PurchaseItemAdmin]

admin.site.register(Order,OrderAdmin)

Ответы:


1

Часть 1

Используйте Inlines, это очень просто, и django превосходит в этот.

Часть 2

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

def save(self, *args, **kwargs):
    if self._initial_data['status'] != self.__dict__['status']:
        self.orderstatushistory_set.create("Status Changed!")
    super(Order, self).save(*args, **kwargs)

Вы могли бы сделать то же самое и в ModelAdmin

def save_model(self, request, obj, form, change):
    if obj._initial_data['status'] != obj.__dict__['status']:
         # create whatever objects you wish!
26.03.2011
  • Кажется, что встроенные строки не работают - Заказ группирует PurchaseItems: есть FK для Заказов из PurchaseItems, поскольку в Заказе может быть много покупок. Но встроенные в администраторе не работают таким образом, класс Order не имеет ForeignKey для класса PurchaseItems 26.03.2011
  • Вы используете встроенные строки в обратном порядке, у PurchaseItems есть внешний ключ для заказа. Следуйте другому ответу на письмо, и вы получите свои строки. Следуйте моим, чтобы получить измененные сообщения о состоянии. 26.03.2011

  • 2

    Часть 1:

    Вы можете «вкладывать» модели в административные модели TabularInline или StackedInline.

    class OrderAdmin(admin.ModelAdmin):
        model = Order
        inlines = [
            OrderStatusAdmin,
            PurchaseItemAdmin
        ]
    
    class OrderStatusAdmin(admin.StackedInline):
        model = OrderStatus
    
    class PurchaseAdmin(admin.StackedInline):
        model = PurchaseItem
    

    Дополнительную информацию можно найти здесь: http://docs.djangoproject.com/en/dev/ref/contrib/admin/#inlinemodeladmin-objects

    Часть 2:

    Мне нужно иметь возможность изменить статус заказа - выбрать из раскрывающегося списка или что-то в этом роде - однако это действие вызывает создание нового элемента statusHistory.

    Для этого можно использовать сигналы. Есть post_save и pre_save. Таким образом, каждый раз, когда вы сохраняете заказ, вы можете добавить дополнительную логику. Сигнал pre_save имеет отправителя и экземпляр, поэтому я думаю, вы можете сравнить статус отправителя и экземпляра, который нужно сохранить, и, если он изменился, вы можете добавить другую модель OrderStatus.

    Дополнительную информацию можно найти здесь: http://docs.djangoproject.com/en/dev/ref/signals/#pre-save

    26.03.2011
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..