Администратор Django: Как мне сериализовать данные и сохранить их в модели, чтобы пользователь мог восстановить их? - PullRequest
0 голосов
/ 15 октября 2019

Итак, у меня есть модель с именем Registration и модель с именем Deleted Registration. Я переопределил действие администратора deleted_selected для Registration, чтобы вместо удаления запроса оно составило Deleted Registration с. Дело в том, что он сохраняет только самых важных частей . У регистраций есть несколько внешних ключей и однозначные поля. Очевидно, что просто сохранить наиболее важные данные недостаточно, и мы хотим сериализовать все данные в выбранных моделях регистрации и сохранить их с удаленной регистрацией. Таким образом, когда вы выбираете несколько удаленных регистраций, вы можете нажать Restore deleted registrations

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

Вот модель регистрации:

class Registration(models.Model):

    objects = RegistrationManager()

    # Used to identify this object securely in urls without giving the actual primary key
    uuid = models.UUIDField(default=uuid.uuid4, editable=False)

    sibs_event = models.ForeignKey("EventInstance", null=True, blank=True)

    date_registered = models.DateTimeField(auto_now_add=True)

    # sibs event for this registration
    sibs_weekend = models.ForeignKey(SibsWeekend, null=False)

    payment_delegation = models.OneToOneField("PaymentDelegation", null=True, blank=True, related_name="registration", on_delete=models.SET_NULL)

Вот модель удаленных регистраций:

class DeletedRegistration(models.Model):
    """
    Just in case of bugs with purging registrants, store
    important registrant information in this model.
    """
    registrant_name = models.CharField(max_length=100)
    registrant_email = models.EmailField(null=True, blank=True)
    registrant_phone_num = models.CharField(max_length=13, null=True, blank=True)
    delegate_name = models.CharField(max_length=100, null=True, blank=True)
    delegate_email = models.EmailField(null=True, blank=True)
    num_of_participants = models.PositiveSmallIntegerField(null=True, default=1)
    special_event = models.CharField(max_length=100, null=True)

Вот переопределенный delete_selected для регистрации:

def delete_selected(modeladmin, request, queryset):
        """
        This overrides the defult deleted_selected because we want to gather the data from the registration and create a
        DeletedRegistration object before we delete it.
        """
        for registration in queryset:
            reg = registration.get_registrant()

            if registration.payment_delegation:
                delegate_name = registration.payment_delegation.name
                delegate_email = registration.payment_delegation.email
            else:
                delegate_name = None
                delegate_email = None

            registration_to_delete = DeletedRegistration.objects.create(
                registrant_name = reg.full_name(),
                registrant_email = reg.email,
                registrant_phone_num = reg.phone,
                delegate_name = delegate_name,
                delegate_email = delegate_email,
                # Filtering out people (with True) who couldn't participate in events because we are only interested in the people
                # we had to reserve space and prepare materials for.
                num_of_participants = registration.get_num_party_members(True),
                special_event = registration.sibs_event,
            )
            registration.delete()

Я ценю вашу помощь! Я просто не знаю, что делать отсюда;Я искал в Интернете, как я могу это сделать, но я не могу обдумать это. Я хочу сохранить сериализованные регистрационные данные как поле в удаленной регистрации, чтобы я мог с помощью действия администратора принять это поле и создать новую регистрацию из него.

...