Джанго - Следите за комментариями - PullRequest
0 голосов
/ 01 марта 2019

Я создаю веб-приложение, в котором у каждого продукта есть свой «Профиль».Мне нужно добавить в модель какое-то поле, где я могу добавить «Комментарии» с датой и текстом для отслеживания информации, такой как изменение формулы, смена провайдера, изменение цены и т. Д.

Любые идеи?

models.py

    from django.db import models

# Create your models here.


class Horse(models.Model):
    name = models.CharField(max_length=255)
    nacimiento = models.DateField(blank=True, null=True)
    nro = models.IntegerField()
    event = models.TextField()
    slug = models.SlugField(unique=True)

    def __str__(self):
        return '%s-%s' % (self.name, self.nro)

Так что для каждого события, которое происходит, мне нужен новый вход с описанием, приведенным в текстовом поле.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Если вы хотите отслеживать различные модели, я бы предложил использовать что-то вроде django-simple-history , чтобы отслеживать изменения в вашей модели.

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

from simple_history.models import HistoricalRecords

class MessageHistoricalModel(models.Model):
    """
    Abstract model for history models tracking custom message.
    """
    message = models.TextField(blank=True, null=True)

    class Meta:
        abstract = True

class Horse(models.Model):
    name = models.CharField(max_length=255)
    birthdate = models.DateField(blank=True, null=True)
    nro = models.IntegerField()
    event = models.TextField()
    slug = models.SlugField(unique=True)

    history = HistoricalRecords(bases=[MessageHistoricalModel,])

Затем, используя сигналы , выможно получить изменения, используя diff , а затем сохранить собственное сообщение с указанием изменений и внесения изменений.

from django.dispatch import receiver
from simple_history.signals import (post_create_historical_record)

@receiver(post_create_historical_record)
def post_create_historical_record_callback(sender, **kwargs):
    history_instance = kwargs['history_instance'] # the historical record created

    # <use diff to get the changed fields and create the message>

    history_instance.message = "your custom message"
    history_instance.save()

Вы можете сгенерировать довольно общий сигнал, который будет работать для всех ваших моделей, отслеживаемых с помощью поля «история».

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

0 голосов
/ 01 марта 2019
class HorseTracker(models.Model):
    horse = models.ForeignKey(Horse, on_delete=models.CASCADE, related_name='horse')
    comment = models.CharField(max_length=128)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

Каждый раз, когда вы что-то меняете в своей модели, вы можете создать новый экземпляр HorseTracker с описанием сделанных вами изменений.

Чтобы сделать его более полезным, вы можете использовать TabularInline вваш HorseAdmin

class HorseTrackerInline(admin.TabularInline):
    model = HorseTracker

class HorseAdmin(admin.ModelAdmin):
    list_display = ['name', 'nacimiento', 'nro', 'event', 'slug', ]
    inlines = [ HorseTrackerInline, ]
...