21

Re: Django - є питання

Master_Sergius написав:
ping написав:

питання таке появилося:
є модель базова

class message(models.Model):
    subject = models.CharField(max_length=100)
    body = models.TextField()
    
    class Meta:
         abstract = True

    def some_method():
          return

від неї треба успадкувати дві моделі Letter i Sms
нічого додавати не потрібно, нових полів не появляється, методів теж нових нема

то так і писати:

class Letter(Message):
    pass

???????


Невже так важко зайти на офіційну документацію?
https://docs.djangoproject.com/en/1.10/ … nheritance

прочитав її кілька разів.
просто якось дико і порожньо виглядає код:

class Letter(Message):
    pass

22

Re: Django - є питання

ping написав:

прочитав її кілька разів.
просто якось дико і порожньо виглядає код:

class Letter(Message):
    pass

Це норма. Наприклад, кастомні виключення робляться ось так:

class SendMessageError(Exception):
    pass

І таким чином у вашій програмі можна однозначно викидати таке виключення і перехоплювати його окремо від загальних.

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/
Подякували: ping1

23

Re: Django - є питання

питання по django rest framework
є серіалайзер:

class NotificationSerializer(serializers.ModelSerializer):
    receiver = serializers.SerializerMethodField('get_notification_receiver')
    def get_notification_receiver(self, kwargs):
        return({kwargs.receiver.id:kwargs.receiver.first_name})
    class Meta:
        model = StudentNotification
        fields = ('id', 'subject', 'body',
                  'receiver_email', 'receiver',)
        read_only_fields = ('id',)

є абстрактна модель Notification, від  якої успадковуються
StudentNotification, TeacherNotification, ... etc
у них єдина відмінність - одне поле (receiver )має ForeignKey на відповідні  моделі Student, Teacher і т.д.
як мені міняти модель, визначену в Мета класі, динамічно, щоб не створювати серіалайзери під кожну з них.
Серіалайзер на абстрактну модель робити не можна .

п.с.
документацію http://www.django-rest-framework.org/ap … serializer читав, багато гуглив.  але відповіді не зауважив :(

24

Re: Django - є питання

Думаю, можна перевизначити __init__. Або є готовий метод. Здається тут: http://stackoverflow.com/a/30833834/4640928

Навчаюсь вчитись, щоб навчатись.
Подякували: ping1

25

Re: Django - є питання

Q-bart написав:

Думаю, можна перевизначити __init__. Або є готовий метод. Здається тут: http://stackoverflow.com/a/30833834/4640928

через ініт не можна, а от через

 def get_serializer_class(self):
        NotificationSerializer.Meta.model = self.category_dict[self.category]
        return NotificationSerializer

працює.

дякую!

26 Востаннє редагувалося ping (10.03.2017 19:04:16)

Re: Django - є питання

таке питання:
є код

Notification.objects.filter(user_id=query_id)

чи можна щось зробити, щоб, якщо query_id не існує - видавало всі об’єкти?
без створення умовно-паралельного запиту типу:

if not query_id:
   Notification.objects.all()

p.s.
вроді знайшов:

kwargs = {
    # you can set common filter params here
}

# will return entries which don't have a deleted_datetime
if exclude_deleted:
    kwargs[ 'deleted_datetime__isnull' ] = True

# will return entries in a specific category
if category is not None:
    kwargs[ 'category' ] = category

# will return entries for current user
if current_user_only:
    kwargs[ 'user' ] = request.user

# will return entries where titles match some search query
if title_search_query != '':
    kwargs[ 'title__icontains' ] = title_search_query

# apply all filters and fetch entries that match all criteria
entries = Entry.objects.filter( **kwargs )

http://www.nomadjourney.com/2009/04/dyn … th-kwargs/

27

Re: Django - є питання

поясніть - це у мене глюк чи у джанги?
так - працює:

def get_job_day_info(request, job_id, date):

    job_date = datetime.datetime.strptime(date, '%Y-%m-%d')     
    job = JobLog.objects.filter(job_id=job_id, created_at__contains = job_date.date())

але не працює так:

def get_job_day_info(request, job_id, date):

    job_date = datetime.datetime.strptime(date, '%Y-%m-%d')     
    job = JobLog.objects.filter(job_id=job_id, created_at__date = job_date.date())

хоча, якщо вибрати тбез фільтра по даті і потім порівнювати - True

for j in job:
   print(j.created_at.date(), job_date.date(), j.created_at.date() == job_date.date())

ЧОМУ?

28

Re: Django - є питання

Дебагати тра. Виводити/логувати значення, як інакше?

Мій блог про ОС сімейства *nix - http://nixtravelling.blogspot.com/

29 Востаннє редагувалося ping (27.03.2017 21:17:50)

Re: Django - є питання

class CalendarSourceAPIView(generics.ListAPIView):
    serializer_class = CalendarSerializer

    def get_queryset(self):
        job_id = self.kwargs['pk']
        filter = self.request.query_params.get('filter', None)
        objects = JobLog.objects.filter(job__user=self.request.user, job__id=job_id)

        start = self.request.query_params.get('start')
        end = self.request.query_params.get('end')

        if filter is not None:
            if filter == 'win':
                objects = objects.filter(state=JobLog.WON, created_at__range=(start_date, end_date))
            if filter == 'lost':
                objects = objects.filter(state=JobLog.LOST, created_at__range=(start_date, end_date))
            if filter == 'count_won':
                today = datetime.datetime.now()
                response_data = []
                for date in daterange(start_date, end_date):
                    if objects.start_date.date() <= date <= today.date():
                        count_won_days = objects.won_days_in_period(objects.start_date.date(),
                                         date + datetime.timedelta(days=1))
                        response_data.append({'start': date.isoformat(), 'title': 'won days :' + str(count_won_days)})
                return response_data
        return objects

як мені у випадку filter == 'count_won' не направляти дані на серіалізацію, а одразу видати на клієнта  ( return response_data) ?
вони вже в готовому форматі.

другий варіант - написати для  filter == 'count_won' окремий серіалізатор i перевизначати його через get_serializer_class, який пропускатиме дані транзитом.

третій варіант - в існуючому  CalendarSerializer робити серіалізацію в залежності від значення filter

Що каже best practice  ? Як правильніше і коректніше?

30

Re: Django - є питання

як правильно реалізувати модель Product, де екземпляр може мати не одне поле ImageField, а наперед невідому кількість  Зображень?

Прихований текст
робити окрему модель - ProductImage і прив'язувати її ForeignKey до  Product ? а в Product писати метод get_images() за яким формувати їх список? але це якось неестетично ?

31

Re: Django - є питання

Зазвичай ми робили  1  модель Image. І через Generic Relation прив'язували до всіх моделей, де треба картинки.

Навчаюсь вчитись, щоб навчатись.