LINUX.ORG.RU

Избранные сообщения PavelShturm

Синтаксис в Templates(необходимо добавить условие)

Форум — Development

Подскажите, как правильно добавить условие:

{% if item.reg_price < 50 %} 
       {% price = item.reg_price + (item.reg_price/100*11,73)+ (item.reg_price/100*24,6) %} 
               <td>{{ price }}</td> 
{% elif 50 <= item.reg_price <= 500 %} 
       {% price = item.reg_price + (item.reg_price/100*12) + (item.reg_price/100*24,9) %} 
               <td>{{ price }}</td> 
{% elif item.reg_price < 500 %} 
       {% price = item.reg_price + (item.reg_price/100*11,75) + (item.reg_price/100*24,3) %} 
               <td>{{ price }}</td> 
{% endif %}

в templates:

{% elif target == 'reestr' %}
        <table class="table table-bordered table-condensed table" onselectstart="return false">
            <thead>
                <tr class="info">
                    <th class="text-center">Наименование</th>
                    <th class="text-center">Производитель</th>
                    <th class="text-center">Цена</th>
                </tr>
            </thead>
            <tbody>
                {% for item in item_list %}
                <tr class="active">
                    <td>{{ item.trade_name }}</td>
                    <td>{{ item.fabr_name}}</td>
                    <td>{{ item.reg_price }}</td> #здесь использовать условие
                </tr>
                {% endfor %}
            </tbody>
        </table>
        
Если заменить <td>{{ item.reg_price }}</td> условием, то начинают валиться ошибки.

Модель:

class TblReestr(models.Model):
    id = models.IntegerField(primary_key=True)  # AutoField?
    ean13 = models.CharField(max_length=50, blank=True, null=True)
    reg_price = models.DecimalField(max_digits=15, decimal_places=2, blank=True, null=True)
    trade_name = models.CharField(max_length=1000, blank=True, null=True)
    fabr_name = models.CharField(max_length=500, blank=True, null=True)
    reg_data = models.DateField(blank=True, null=True)
    mnn_name = models.CharField(max_length=250, blank=True, null=True)
    valuta_name = models.CharField(max_length=20, blank=True, null=True)
    num_prikaz = models.CharField(max_length=30, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'tbl_reestr'

Views:

def search(request):
    q = request.GET['q']
    target = request.GET['target']
    title = request.GET['title']
    if target == 'brak':
        item_list = TblBrak.objects.filter(trade_name__icontains=q)
    elif target == 'reestr':
        item_list = TblReestr.objects.filter(trade_name__icontains=q)

Подскажите, как правильно в templates использовать такое условие.

 ,

PavelShturm
()

Celery запускает планировщик чаще чем указано в настройках

Форум — Web-development

Здравствуйте! Подскажите в чем может быть проблема с Celery worker? Когда запускаю его он начинает выполнять задание чаще чем раз в секунду, хотя стоит интервал в несколько минут.

  • - Запуск воркера: «celery -A market_capitalizations worker -l info -S django»
  • - Запуск бита: «celery market_capitalizations beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler»

Настройки:

    INSTALLED_APPS = [
        'django.contrib.admin',
        'django.contrib.auth',
        'django.contrib.contenttypes',
        'django.contrib.sessions',
        'django.contrib.messages',
        'django.contrib.staticfiles',
        'exchange_rates',
        'django_celery_beat',
        'django_celery_results',
        ]
    TIME_ZONE = 'Europe/Saratov'
    USE_I18N = True
    USE_L10N = True
    USE_TZ = True

    CELERY_BROKER_URL = 'redis://localhost:6379'
    CELERY_RESULT_BACKEND = 'redis://localhost:6379'
    CELERY_ACCEPT_CONTENT = ['application/json']
    CELERY_TASK_SERIALIZER = 'json'
    CELERY_RESULT_SERIALIZER = 'json'
    CELERY_TIMEZONE = TIME_ZONE 
    CELERY_ENABLE_UTC = False
    CELERYBEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler'
Ссылки на картинки в image хостинге.

При запуске задачи, не отправляется запрос.

Подскажите ,пожалуйста, как сделать чтоб сельдерей подхватывал время задачи с веб страницы и запускал задачу с нее же?

Пробовал запускать задачу через код, но она все равно выполняется чаще чем в секунду.

    from celery.schedules import crontab
    app.conf.beat_schedule = {
        'add-every-5-seconds': {
            'task': 'save_exchange_rates_task',
            'schedule': 600.0,
            #'args': (16, 16)
        },
    }

 , ,

PavelShturm
()

Запись данных из requests запроса в БД django по расписанию.

Форум — Web-development

Пытаюсь разобраться с работой планировщика django-rq-scheduler . Имеется небольшая модель:

class Currency(models.Model):
    name = models.CharField('Название валюты', max_length=20)
    price_usd = models.DecimalField(
        'Курс в долларах', max_digits=20, decimal_places=10, blank=True, null=True)
    last_updated = models.IntegerField('Последние обновление')


    def __str__(self):
        return '%s %s %s' % (self.name, self.price_usd, self.last_updated)
  • Вот варианты кода,которыми пытаюсь записать данные: 1)
    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates():
        
        url = 'https://api.coinmarketcap.com/v1/ticker/'
        repositories = requests.get(url).json()
        for exchange in repositories:
            cur = Currency()
            cur.name = exchange['name']
            cur.price_usd = exchange['price_usd']
            cur.last_updated =  exchange['last_updated']
            cur.save()
    
    if __name__ == '__main__':
        save_exchange_rates()
    

    2)

    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates():
        
        url = 'https://api.coinmarketcap.com/v1/ticker/'
        repositories = requests.get(url).json()
        for exchange in repositories:
            Currency.objects.create(name=exchange['name'],
                                    price_usd=exchange['price_usd'],
                                    last_updated=exchange['last_updated'],)
    
    
    if __name__ == '__main__':
        save_exchange_rates()
    
    При попытке запустить их вручную, возникает ошибка:
    Traceback (most recent call last):
      File "task.py", line 2, in <module>
        from models import Currency
      File "/home/pavel/django/market_coins/market_capitalizations/exchange_rates/models.py", line 10, in <module>
        class Currency(models.Model):
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/db/models/base.py", line 100, in __new__
        app_config = apps.get_containing_app_config(module)
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/apps/registry.py", line 244, in get_containing_app_config
        self.check_apps_ready()
      File "/home/pavel/django/market_coins/env/lib/python3.5/site-packages/django/apps/registry.py", line 127, in check_apps_ready
        raise AppRegistryNotReady("Apps aren't loaded yet.")
    django.core.exceptions.AppRegistryNotReady: Apps aren't loaded yet.
    
    
    Подскажите, о Гуру, в чем может быть причина?
  • И еще вопрос про Repeatable Jobs в админке. Можно ли там передать параметр к выполняемой функции в поле Callable: .Для примера, хочу вызывать функцию с помощью django-rq-scheduler для каждой валюты с разным расписанием:
    import requests
    from models import Currency
    from django_rq import job
    
    
    
    @job
    def save_exchange_rates(coin):
        
        url = 'https://api.coinmarketcap.com/v1/ticker/{}/'.format(coin)
        exchange = requests.get(url).json()
        Currency.objects.create(name=exchange['name'],
                                price_usd=exchange['price_usd'],
                                last_updated=exchange['last_updated'],)
    
    
    if __name__ == '__main__':
        save_exchange_rates()
    

 

PavelShturm
()

реализация скидки на услуги(товар) в django

Форум — Web-development

Доброго времени суток!

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

- Как можно рассчитать итоговую цену со скидкой и записать ее в таблицу «Paiments» в поле «finish_price»? При этом данные взять из таблицы «Price», которая является внешним ключом для поля «price_of_paiment»

- Можно ли использовать «choices=» для подставления данных о скидке или лучше сделать отдельную таблицу с этими данными,т.к. данные в кортеже не будут числовыми?

На просторах интернета нашел использование функции «def get_sale(self):» которую подставил в рассчет абонемента, но так и не понял ,как туда попадут данный из поля «whole_price» для расчета и как потом записать получившийся результат в поле «finish_price».

Стоит ли дедать первичным ключем поле «whole_price», т.к. планируется не более 5 записей, и можно ли будет получить из нее данные для вычислений в таблице «Price»?

class Price(models.Model):
name_paiment = models.CharField('Название абонемента', max_length=20, unique=True)
whole_price = models.IntegerField('Цена', default=0, )
price_for_one_time = models.IntegerField('Цена за 1 посещение',)
number_of_visits = models.IntegerField('Количество посещений')

def __str__(self):
    return '%s %s' % (self.name_paiment, self.whole_price)

class Paiments(models.Model):
DISCOUNT = (
    ('0', 'нет скидки'),
    ('5', '5%'),
    ('10', '10%'),
    ('15', '15%'),
    ('20', '20%'),
    ('25', '25%'),
    ('30', '30%'),
)
paiment_of_student = models.ForeignKey(Student)
price_of_paiment = models.ForeignKey(Priсe, verbose_name='Название абонемента')
discount = models.IntegerField('Скидка в процентах', blank=True, default=0, choices=DISCOUNT) #ругается на значения, которые выбираешь.
begin_date = models.DateTimeField('Дата начала', default=timezone.now)
end_date = models.DateTimeField('Дата окончания')
finish_price = models.IntegerField(get_sale()) #пишет,что имя не определено.

def get_sale(self):
    '''Расчитать стоимость со скидкой'''
    end_price = int(self.price_of_paiment * (100 - self.discount) / 100)
    return end_price

Прошу прощения ,если где-то не правильно выразил мысль. Подскажите,как реализовать мои идеи, по возможности с кодом, т.к. просто на словах не пойму из-за неопытности.

 , ,

PavelShturm
()