Я мог бы упустить что-то простое здесь. И мне просто не хватает знаний или каких-то практических советов.
У меня две модели, одна site
, другая siteField
и самая главная - siteFieldValue
.
Моя идея состоит в том, чтобы создать таблицу django (для site
), которая использует значения из siteFieldValue
в виде числа в строке для определенного сайта под определенным заголовком. Проблема в том, что на каждом сайте их может быть 50. Это * количество столбцов, указанное функциями def render_
* количество сайтов равно количеству запросов, и я хочу избежать этого.
Мой вопрос: можно ли, например, предварительно выбрать все значения для каждого сайта (SiteFieldValue.objects.filter(site=record).first()
где-то в классе SiteListTable
), поместить их в массив, а затем использовать их в функциях def render_
, просто проверив значение, присвоенное ключу (идентификатор поля).
Модели:
class Site(models.Model):
name = models.CharField(max_length=100)
class SiteField(models.Model):
name = models.CharField(max_length=100)
description = models.CharField(max_length=500, null=True, blank=True)
def __str__(self):
return self.name
class SiteFieldValue(models.Model):
site = models.ForeignKey(Site, on_delete=models.CASCADE)
field = models.ForeignKey(SiteField, on_delete=models.CASCADE)
value = models.CharField(max_length=500)
Представление таблицы
class SiteListTable(tables.Table):
name = tables.Column()
importance = tables.Column(verbose_name='Importance',empty_values=())
vertical = tables.Column(verbose_name='Vertical',empty_values=())
#... and many more to come... all values based on siteFieldValue
def render_importance(self, value, record):
q = SiteFieldValue.objects.filter(site=record, field=1).first()
# ^^ I don't want this!! I would want the SiteFieldValue to be prefetched somewhere else for that model and just check the array for field id in here.
if (q):
return q.value
else:
return None
def render_vertical(self, value, record):
q = SiteFieldValue.objects.filter(site=record, field=2).first()
# ^^ I don't want this!! I would want the SiteFieldValue to be prefetched somewhere else for that model and just check the array for field id in here.
if (q):
return q.value
else:
return None
class Meta:
model = Site
attrs = {
"class": "table table-striped","thead" : {'class': 'thead-light',}}
template_name = "django_tables2/bootstrap.html"
fields = ("name", "importance", "vertical",)
🤔 А знаете ли вы, что...
Python используется в научных вычислениях и обработке изображений с использованием библиотеки OpenCV.
Это может помочь вам начать. Я разбил его на этапы, но их можно довольно легко связать.
#Get all the objects you'll need. You can filter as appropriate, say by site__name).
qs = SiteFieldValue.objects.select_related('site', 'field')
#lets keep things simple and only get the values we want
qs_values = qs.values('site__name','field__name','value')
#qs_values is a queryset. For ease of manipulation, let's make it a list
qs_list = list(qs_values)
#set up a final dict
final_dict = {}
# create the keys (sites) and values so they are all grouped
for site in qs_list:
#create the sub_dic for the fields if not already created
if site['site__name'] not in final_dict:
final_dict[site['site__name']] = {}
final_dict[site['site__name']][site['name']] = site['site__name']
final_dict[site['site__name']][site['field__name']] = site['value']
#now lets convert our dict of dicts into a list of dicts
# for use as per table2 docs
data = []
for site in final_dict:
data.append(final_dict[site])
Теперь у вас есть список диктов, например, [{'name':site__name, 'col1name':value...] и может добавить его, как показано в документации table2