Причина, по которой у вас возникла проблема, заключается в том, что она только пытается сопоставить «голые» адреса. http://www.google.com/ http://www.google.com ".
Запуск текста через Html.fromHtml () должен сделать трюк. Вы должны сделать это программно, но он работает.
Вы не можете хранить функции (функции 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]
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, я думаю, его можно, но очень опасно, и я не рекомендую его
Вы можете сделать только 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)