Сохранение вызова функции в модели Django

Причина, по которой у вас возникла проблема, заключается в том, что она только пытается сопоставить «голые» адреса. http://www.google.com/ http://www.google.com ".

Запуск текста через Html.fromHtml () должен сделать трюк. Вы должны сделать это программно, но он работает.

0
задан RustyBrain 13 July 2018 в 12:48
поделиться

3 ответа

Вы не можете хранить функции (функции Python, которые я имею в виду) в базе данных SQL, действительно. Но вы можете сохранить любое текстовое значение, и у вас может быть ключ «key: func» в вашей модели, то есть:

class DataSourceFamilies(models.Model):
    name = models.CharField(max_length=200, unique=True)
    source_url = models.CharField(max_length=300, blank=False)
    slug = models.CharField(max_length=200, blank=False)

    SLUG_TREATEMENTS = [
        # key, label, function
        ('year_camel_month', "Year, Camel month", year_camel_month),
        ('year_month': "Year month", year_month),
    ]  
    SLUG_TREATEMENTS_ACTIONS = {
        k: func 
        for k, label, func in SLUG_TREATEMENTS
    }

    SLUG_TREATEMENTS_CHOICES = [
        (k, label)
        for k, label, func in SLUG_TREATEMENTS
    ]

    slug_treatment = models.CharField(
        max_length=50 # let's have a little headroom, 
        choices=SLUG_TREATMENT_CHOICES
        )

    def get_slug_treatment_func(self):
        return self.SLUG_TREATEMENTS_ACTIONS[self.slug_treatment]
1
ответ дан bruno desthuilliers 17 August 2018 в 12:49
поделиться
  • 1
    Спасибо, я это сделал, проверит в понедельник. Думаю, что мне нужно было сделать это, чтобы это работало, чтобы сначала иметь значение, а затем называть в кортежах в списках, чтобы не получать ошибки Django, где он пытался распаковать неожиданное количество элементов. – RustyBrain 14 July 2018 в 20:18
  • 2
    Я пробовал это, но я получаю ошибки - если у меня есть пара ключей, значение, которое у вас есть в вашем примере, то варианты отображаются как пробелы на странице администратора. Если я выберу одну из «пробелов», она сохранит строку имени как часть модели. Если я вернусь, чтобы иметь значение, пара ключей, я получаю правильное имя на странице администратора, когда я пытаюсь сохранить его ошибки и говорит, что выбор недействителен. Какие-либо предложения? @ Брюно-desthuilliers – RustyBrain 16 July 2018 в 09:24
  • 3
    да жаль написал это слишком быстро, обновит этот пример кода. – bruno desthuilliers 16 July 2018 в 10:15
  • 4
    @RustyBrain сделано. – bruno desthuilliers 16 July 2018 в 11:01
  • 5
    Это, похоже, сделало трюк - спасибо. Я выбрал этот ответ по альтернативе, предоставленной @ritlew, поскольку это приведет к меньшему дублированию. – RustyBrain 16 July 2018 в 16:00

Sry его немного запутывает для меня, но на основе того, что я понял, возможно, вы можете объявить все функции в своем классе и использовать slug_treament в качестве параметра, к которому будет вызываться функция, когда вам нужно.

Lets сделайте это немного

YEAR_CAMEL_MONTH=1 
YEAR_MONTH=2
SLUG_TREATEMENTS_CHOICES = [
        (YEAR_CAMEL_MONTH: 'year_camel_month'),
        (YEAR_MONTH: 'year_month'),
    ]

class DataSourceFamilies(models.Model):
    ...
    slug = models.CharField(max_length=200, blank=False)
    slug_treatment = models.IntegerField(choices=SLUG_TREATMENT_CHOICES)

    def year_camel_month(self):
        ... # Your logic
        return formated_slug

    def year_month(self):
        ... # Your logic
        return formated_slug

    def save(self *args **kwargs):
        if self.slug_treatment == YEAR_CAMEL_MONTH:
            self.slug = self.year_camel_month()
        elif self.slug_treatment == YEAR_MONTH:
            self.slug = self.year_month()
        super(DataSourceFamilies, self).save(*args, **kwargs)

Или вы можете использовать его как метод prorperty вместо сохраняемых данных (так что slug будет оцениваться каждый раз при вызове вашего запроса, поэтому он является динамическим, а не постоянным » Obs .: методы свойств работают как столбцы из вашей базы данных, но не сохраняются, как CAST в базе данных

class DataSourceFamilies(models.Model):
    ...        
    slug_treatment = models.IntegerField(choices=SLUG_TREATMENT_CHOICES)

    @property
    def slug(self):
        if self.slug_treatment == YEAR_CAMEL_MONTH:
            return slug = self.year_camel_month()
        elif self.slug_treatment == YEAR_MONTH:
            return slug = self.year_month()

https://docs.djangoproject.com/en /2.0/topics/db/models/

Замечание. Если вы пытаетесь получить код из текста и оценить его в python, я думаю, его можно, но очень опасно, и я не рекомендую его

0
ответ дан Diego Vinícius 17 August 2018 в 12:49
поделиться
  • 1
    Может быть ... просто, может быть ... вы можете обобщить вызов функции, передаваемой в качестве аргументов для метода ownpy или save ... вместо того, чтобы пытаться оценить все тело функции – Diego Vinícius 13 July 2018 в 14:20
  • 2
    Имейте в виду, что любой программист может редактировать вашу «форму администратора». или что-нибудь, что вы будете использовать для взаимодействия с пользователем и изменить весь код, так как его код таким текстом вы не сможете дополнить, чтобы избежать его ... так что люди могут просто написать какой-то вредоносный код, и когда вы запускаете его на своем сервере, вы даже повредить сервер ... – Diego Vinícius 13 July 2018 в 14:21

Вы можете сделать только CharField, а затем eval . Однако использование eval обычно представляет собой огромный риск для безопасности. Любой код python, который входит в него, будет выполнен, и вы не хотите ничего подобного в веб-приложении.

Другой вариант - иметь систему поиска. Вы могли бы, скажем, иметь CharField с вариантами, соответствующими этому словарю:

models.py
...
slug_treatment = models.CharField(max_length=100, choices=function_choices)
...

И затем:

get_data.py

function_lookup = {
    "year_month": year_month,
    "year_camel_month": year_camel_month
}

processed_slug = function_lookup[data_source.slug_treatment](slug, some_kwargs)
1
ответ дан ritlew 17 August 2018 в 12:49
поделиться
  • 1
    Спасибо за этот ответ. Кажется, он работает, но у меня есть 50 функций, которые можно выбрать в моей реализации. Тот факт, что мне придется иметь список вариантов в модели, то словарь для выполнения поиска будет означать, что у меня будет больше дублирования, чем ответ, представленный @ bruno-desthuilliers. Я действительно ценю совет, хотя! – RustyBrain 16 July 2018 в 15:57
Другие вопросы по тегам:

Похожие вопросы: