
Pavel
06.08.2017
16:06:31
т.е. если отправить json, то придеться этому json дать имя

Artem
06.08.2017
16:06:50
да, верно!
и если надо файл, то в качестве ключа указываешь например:
—----WebKitFormBoundaryPfKUrmBd9vRwp5Rb
Content-Disposition: form-data; name="picture"
<here file>
ааа

Pavel
06.08.2017
16:09:16
вот запрос я отправил на сервер, но сервер сам не узнает, где там искать json

Google

Artem
06.08.2017
16:09:27
а зачем прям жысон шлешь? шли туда поле

Pavel
06.08.2017
16:09:34
у меня сериализотор по модели сейчас сделан

Artem
06.08.2017
16:09:51
карч, есть фича: - ast
потому вот пример:
if multipart:
import ast
sales = []
tmp_sales = mobile_data.getlist('sale[]')
for sale in tmp_sales:
i = sale.replace("'", '"')
sales.append(ast.literal_eval(i))

Pavel
06.08.2017
16:10:52
вот так?

Artem
06.08.2017
16:10:57
ast приведет твою строку ччерез eval, и будет на выходе норм словарь
Дааа, то что ннада

Pavel
06.08.2017
16:12:04
ага, но есть проблема. Если я отправлю null, то сервер парсит как строку. А мне нужен null, как в json, чтобы парсер понял, что null нужно перевести в None и сделать null в БД

Artem
06.08.2017
16:12:46
тогда используй ast
и скармливай туда ту часть строки

Pavel
06.08.2017
16:13:28
поэтому я и хочу отправить в одном запросе файл + чистый валидный json. Просто в DRFиз коробки нельзя такое распарсить, нужно чутка дописать

Artem
06.08.2017
16:14:11
чувак, я тебе говорю, используй ast, который тебе любую строку приведет к нормальным данным

Pavel
06.08.2017
16:14:12
хорошо, попробую ast

Google

Artem
06.08.2017
16:14:22
ast.literal_eval(i)
я так лист со словарями разбираю, отлично работает

Pavel
06.08.2017
16:15:22
хорошо, спасибо

Artem
06.08.2017
16:15:47
пожалйста

Bob
06.08.2017
16:19:19
Да, прикольно, заглянул в доку (про ast)

Roman
06.08.2017
16:43:24
Были на маке у кого такие проблемы? https://stackoverflow.com/questions/45534078/importerror-no-module-named-distribute-setup

Artem
06.08.2017
16:53:06

Roman
06.08.2017
17:00:42
да и они активные ) так что че тут выпенриватся то

Ruslan
06.08.2017
17:04:15
сможете помочь

Roman
06.08.2017
17:08:07
фигасе тут драмы
Thank you for your attention to this. As it says in the distribute documentation at http://pythonhosted.org/distribute/, "Distribute is a deprecated fork of the Setuptools project. Since the Setuptools 0.7 release, Setuptools and Distribute have merged and Distribute is no longer being maintained." At one time, py*-setuptools was replaced by py*-distribute. More recently, this was undone, and py*-distribute was replaced by py*-setuptools. The py27-pytools install does not fail for me in the same way, probably because of fixes made to setuptools, but the build output shows it is not behaving correctly:


Ruslan
06.08.2017
17:11:03
есть моделька:
`
class Question(models.Model):
NEW = 'New'
ACTIVE = 'Active'
ENDED = 'Ended'
STATE = (
(NEW, 'Новый'),
(ACTIVE, 'Активный'),
(ENDED, 'Конечный'),
)
question_text = models.CharField(max_length=200)
pub_date = models.DateTimeField('date published')
state = models.CharField(max_length=6, choices=STATE, default=NEW)
def str(self):
return self.question_text
`
есть admin.py
`
def change_view(self, request, object_id, form_url='', extra_context=None):
State = Question.objects.get(pk=object_id).state
QuestionInLine.readonly_fields = ''
if State == 'New':
QuestionChoice.inlines = [QuestionInLine, ]
QuestionInLine.exclude = ('votes', )
form = QuestionForm
if State == 'Active':
QuestionChoice.inlines = [QuestionInLine, ]
QuestionInLine.readonly_fields = (Question, )
QuestionInLine.exclude = ''
if State == 'Ended':
QuestionChoice.inlines = ''
return super(QuestionChoice, self).change_view(request, object_id, form_url, extra_context)
`
отображение колонок меняется в зависимости от статуса State (какие-то показываются, какие-то нет)
есть функция:
`
def formfield_for_choice_field(self, db_field, request, **kwargs):
if db_field.name == 'state':
kwargs['choices'] = (
('NEW', 'Новый'),
('ACTIVE', 'Активный'),
)
kwargs["queryset"] = Question.objects.filter(state = 'New')
return super(QuestionChoice, self).formfield_for_choice_field(db_field, request, **kwargs)
`
которая меняет значения choice (выбора)
как мне в зависимости от текущего значения (Новый, Активный, Конечный) отдавать ограниченный выбор choice
как мне object_id дернуть в formfield_for_choice_field


Bob
06.08.2017
17:27:28
self.instance.pk ?
Оно?

Ruslan
06.08.2017
17:27:47
а куда его передать?

Bob
06.08.2017
17:28:10
Никуда, оно уже там должно быть

Ruslan
06.08.2017
17:28:14
formfield_for_choice_field у меня будет меняться в зависимости от object_id

Bob
06.08.2017
17:28:50
напиши принт в начале и посмотри что покажет и думай че с этим делать

Ruslan
06.08.2017
17:29:07
а куда он покажет?

Google

Ruslan
06.08.2017
17:29:11
в консоль?

Bob
06.08.2017
17:29:33
да
где dev сервер запущен

Ruslan
06.08.2017
17:29:59
AttributeError: 'QuestionChoice' object has no attribute 'instance'
локально

Bob
06.08.2017
17:31:40
def formfield_for_choice_field(self, db_field, request, **kwargs):
print(self.instance.pk)
....
Это имел ввиду

Ruslan
06.08.2017
17:32:25
ошибка

Bob
06.08.2017
17:32:54
Тогда выложи исходник куданить, а то не понятно

Ruslan
06.08.2017
17:33:27
могу тебе в личку скинуть
или в чат

Bob
06.08.2017
17:34:47
codepad.org

Ruslan
06.08.2017
17:54:17
в общем смог из урла дернуть значение pk. Все таки formfield_for_choice_field не передает в тело функции сам объект
это плохо
но видимо так надо

Bob
06.08.2017
17:55:34
ну тож решение, схема url не будет меняться скорее всего
по коду: переменные с заглавных не комильфо
Это только для классов, либо все прописные для констант
kwargs['choices'] = (
('NEW', 'Новый'),
('ACTIVE', 'Активный'),
)
- нужно бы избавиться от дублирования кода, а том потом обслужить будет муторно


Vadim
06.08.2017
19:03:53
Всем привет!
Есть вопрос по Django (Django Rest Framework). Вот есть у меня serialiser:
class CompanySerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=255, required=True)
start_date = serializers.DateField(required=True)
description = serializers.CharField()
city = serializers.CharField(required=True, max_length=255)
owner_id = serializers.IntegerField(required=True, write_only=True)
def create(self, validated_data):
""" Create company method """
owner_id = validated_data.pop('owner_id', None)
company = Company.objects.create(**validated_data)
company_member = CompanyMember.objects.create(user_id=owner_id,
company_id=company.id,
role='owner')
return company
И ViewSet:
class CompaniesListViewSet(viewsets.ViewSet):
def create(self, request):
""" Creates a new company """
serializer = CompanySerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'company': serializer.data},
status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
Как я понимаю, если `serializer.is_valid() проходит успешно, а в serializer.save() происходит ошибка, то запрос все равно будет успешным?
Исходя из подходов Django и Django Rest Framework как правильно учесть данный нюанс? Сделать метод, отличный от save или всю логику вынести в какой-то другой объект, отвечающий за создание/обновление объектов, а serialiser использовать только для json-ответов? Заранее благодарю!

Google

0x255
06.08.2017
19:15:43
> Как я понимаю, если `serializer.is_valid() проходит успешно, а в serializer.save() происходит ошибка, то запрос все равно будет успешным?
нет, вернется 500.
> Исходя из подходов Django и Django Rest Framework как правильно учесть данный нюанс?
обернуть код в django.db.transaction.atomic (или если речь о вьюхе, то смотри в сторону django.utils.decorators.method_decorator)

Vadim
06.08.2017
19:17:07

0x255
06.08.2017
19:17:44
ну как тебе будет удобно. почитай про транзакции БД

Vadim
06.08.2017
19:18:39
Я вот и хотел обернуть все это транзакцией, но не во вьюхе, а в отдельном объекте
который будет валидировать и сохранять, возвращая True/False
Но коллеги говорили, что так не делают, стараются обходится функционалом serializer-ов

Admin
ERROR: S client not available

Bob
06.08.2017
19:19:49
Объект - это некий менеджер?

Vadim
06.08.2017
19:20:02
ну что-то вроде form-object-а
Через который будет происходить создание/обновление

0x255
06.08.2017
19:20:49
а зачем? оберни в CompanySerializer.create() и если файл все-таки случается - можешь выводить соответсвующие ошибки хоть словарем

Bob
06.08.2017
19:20:56
я не спец в DRF, но не проще ли дописать сам сериализатор?


amureki
06.08.2017
19:21:44
Всем привет!
Есть вопрос по Django (Django Rest Framework). Вот есть у меня serialiser:
class CompanySerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=255, required=True)
start_date = serializers.DateField(required=True)
description = serializers.CharField()
city = serializers.CharField(required=True, max_length=255)
owner_id = serializers.IntegerField(required=True, write_only=True)
def create(self, validated_data):
""" Create company method """
owner_id = validated_data.pop('owner_id', None)
company = Company.objects.create(**validated_data)
company_member = CompanyMember.objects.create(user_id=owner_id,
company_id=company.id,
role='owner')
return company
И ViewSet:
class CompaniesListViewSet(viewsets.ViewSet):
def create(self, request):
""" Creates a new company """
serializer = CompanySerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response({'company': serializer.data},
status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
Как я понимаю, если `serializer.is_valid() проходит успешно, а в serializer.save() происходит ошибка, то запрос все равно будет успешным?
Исходя из подходов Django и Django Rest Framework как правильно учесть данный нюанс? Сделать метод, отличный от save или всю логику вынести в какой-то другой объект, отвечающий за создание/обновление объектов, а serialiser использовать только для json-ответов? Заранее благодарю!
почему не ModelSerializer, для начала?
и почему сейв с ошибкой вылетит после is_valid??


0x255
06.08.2017
19:22:16

amureki
06.08.2017
19:34:18
Исправьте текущий код, там может и ошибки пропадут :)

Vadim
06.08.2017
19:37:55
Текущий код работает (вроде ?)
Сейчас заменил таким образом:
class CompaniesListViewSet(viewsets.ViewSet):
def create(self, request):
""" Creates a new company """
serializer = CompanySerializer(data=request.data)
if serializer.is_valid() and serializer.save():
return Response({'company': serializer.data},
status=status.HTTP_201_CREATED)
else:
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
При исключении в create serializer-а возвращаю False

amureki
06.08.2017
19:41:16
текущий код если и работает, то не оптимально, раз вы задаете вопросы)
читаем http://www.django-rest-framework.org/api-guide/viewsets/#modelviewset
и http://www.django-rest-framework.org/api-guide/serializers/#modelserializer
и не изобретаем велосипедов

Vadim
06.08.2017
19:42:49

darkwoolf
06.08.2017
20:24:04
Хаиль
слушайте

Google

darkwoolf
06.08.2017
20:24:21
на локальной машине if user.is_authenticated работает
А когда деплою код на pythonanywhere то нет

Трусов
06.08.2017
20:35:07
парни, есть вот такая моделька
http://i.imgur.com/UopgYu8.png
как загрузить Briefcases, но не грузить stuff с show_status = False
Думал, что то типо такого case = Briefcases.objects.filter(id=pk, stuff__show_status=True)
но нет
ну или хотя бы как их удалить из кверисета просто перебором?
http://i.imgur.com/cI4OlZv.png

Andy
06.08.2017
21:03:06

Трусов
06.08.2017
21:03:24
Именно

Ruslan
06.08.2017
21:19:24
https://github.com/mirumee/saleor
?
Развернул его сегодня, но так и не смог ему передать secret_key через export(как в их доках). Прописал его в сеттингс временно, но хотелось бы понять, почему ключ не передается куда положено?

Dmitriy
06.08.2017
21:25:04

Трусов
06.08.2017
21:29:29
или я что то недогоняю?

Dmitriy
06.08.2017
21:31:26

Трусов
06.08.2017
21:31:55
primary key я имел ввиду

Dmitriy
06.08.2017
21:32:25
Короч объясни что ты хочешь сделать

Трусов
06.08.2017
21:34:01
у меня есть модель Briefcases и модель Stuff. У Briefcases есть ManyToManyField к Stuff. Мне нужно получить по id Briefcases и всего Stuff, которые ему принадежать, но при этом я должен получить только те Stuff ,у коготорых show_status = False
и все его Stuff*

Dmitriy
06.08.2017
21:40:11
stuffs = model.objects.get(id=id).stuff.filter(show_status=False)
Чот такое