Прежде всего, независимо от вашего вопроса, поле m2m ваших ролей должно быть обновлено следующим образом:
roles = models.ManyToManyField(Role, related_name='users')
related_name - это то, как вы ссылаетесь на текущую модель (User) из модели, переданной в ManyToManyField (Role). С моим предложением вы бы написали Role.objects.first().users
, а не Role.objects.first().roles
.
Во-вторых, если это возможно, я бы рекомендовал передать роли для создания / обновления пользователя в виде списка первичных ключей. Даже если это означает создание второго свойства сериализатора, которое предназначено только для записи. Например:
class UserSerializer(serializers.ModelSerializer):
roles = RoleSerializer(many=True, read_only=True)
role_ids = serializers.PrimaryKeyRelatedField(
queryset=Role.objects.all(),
many=True, write_only=True)
class Meta:
model = User
fields = ('url', 'username', 'password', 'email', 'roles', 'role_ids')
extra_kwargs = {'password': {'write_only': True}}
def create(self, validated_data):
password = validated_data.pop('password')
# Allow the serializer to handle the creation. Don't do it yourself.
instance = super().create(**validated_data)
if password is not None:
instance.set_password(password)
instance.save()
return instance
Когда ваш API выплевывает пользователей, он должен выглядеть следующим образом:
{
'url': '...',
'username': '...',
'email': '...',
'roles': [{'id': 1, 'name': 'client'}],
}
Когда вы POST к нему, вы должны использовать:
{
'url': '...',
'username': '...',
'email': '...',
'password': '...',
'role_ids': [1, 2],
}
Кроме того, причина, по которой вы получили ошибку User does not have an attribute named roles.
, заключается в том, что вы не можете передать roles
в конструктор User
. User.roles
необходимо установить после того, как у вас есть экземпляр. Вы должны были сделать:
user = User(**validated_data)
user.roles.set(roles) # If you need to re-write the entire list.
Несмотря на то, что у меня в голове, я не уверен, что это сработает. Возможно, вам придется сохранить его заранее. Вот почему я предлагаю вам использовать super().create
вместо этого.
это будет работать над Mac и Linux?
Не обязательно.
Рендеринг шрифта является самой большой проблемой с таким межплатформенным. Некоторые шрифты, которые доступны в Windows, не включены в других по умолчанию, и OSX имеет очень тяжелую представляющую шрифт модель (хотя Safari в Windows должен показать это - по крайней мере, это привыкло для).
Общие модели поля, дополнение, поля, и др. должны все быть стандартными.
область Mac очень хитра. различные версии операционной системы имеют различные версии сафари, таким образом, это делает это действительно жестким, не имея набора макинтошей для тестирования. если это выглядит хорошим на сафари для окон, возможности, будет выглядеть хорошим на сафари для Mac особенно, если Ваше основное беспокойство будет с ширинами отделения.
Linux имеет убивание браузеров, и я серьезно сомневаюсь, что любой там тестирует всех их. так как Firefox работает в Linux, у Вас есть хороший процент крытого рынка Linux.
у Вас уже есть более чем 95% рынка браузеров, покрытого браузерами, которые Вы протестировали.
Это позволит Вам просматривать свой сайт в нескольких браузерах через несколько платформ (Включенный Linux). Однако могу я подчеркивать, что возможности Вас заставляющий Ваш веб-сайт посмотреть 100%, идентичных в каждом, фактически невозможны, и иногда необходимо согласиться на 99%.
Думайте о своей целевой аудитории и какой браузер/ОС они обычно собираются использовать. Кроме того, после того, как сайт возрос, выполняет некоторое отслеживание статистики (как аналитика Google) и определяет то, что используется Вашей аудиторией.
OS X имеет много основанных на WebKit браузеров, т.е. Safari/Shiira/iCab/OmniWeb, а также Firefox/SeaMonkey/Camino и Opera. У меня нет статистики, но я предположил бы, что это покрывает по крайней мере 98% всех пользователей.
Результаты конкурса популярности Debian:
w3m 85.93% iceweasel 60.35% lynx 25.71% konqueror 21.95% links 9.23% iceape-browser 6.69% elinks 6.51% links2 4.09% dillo 2.70% galeon 2.35% epiphany 0.79% w3m-el 0.75% kazehakase 0.58% midori 0.30% arora 0.29%
(Это не отслеживает пользователей с не - [DFSG], свободный* программное обеспечение, таких как Mozilla Firefox и Opera.) Пользователи Linux являются очень разнообразной толпой; даже если Вы тестируете с Mozilla Firefox, Opera и Konqueror от KDE 4 в Windows, Вы даже не близко к покрытию большей части базы пользователей.
Однако при сужении фокуса к браузерам с поддержкой современного CSS Вы найдете, что существует только несколько базовых механизмов: Трайдент (IE), Геккон (Mozilla), WebKit (Apple), KHTML (KDE), и Престо (Opera). Взятие их индивидуально:
Как упомянуто другим ответом, парсингом HTML и моделью фрагмента CSS для каждого механизма неизменно через платформы. Это - только "небольшой" материал как шрифты, изображения и плагины, которые будут действовать по-другому.
по моему опыту, FF3 на Mac и Win не представляет точно то же, но все еще достаточно близко не потрудиться проверять обоих.
Это будет, скорее всего, работать, хотя я видел экземпляры, где что-то работает в FF3 на Windows, все же не делает для FF3 на OS X.
Я согласен, рендеринг шрифтов будет зависеть от FF3 win / mac и вызвал некоторые проблемы с позиционированием для меня