Mam model profilu, który ma relację jeden-do-jednego z modelem użytkownika Django, i mam inny model o nazwie Permission (niezwiązany z wewnętrzną koncepcją uprawnień Django), który ma klucz obcy do profilu. Tak: (I usunęliśmy większość pól tutaj, dla uproszczenia)Django REST Framework: SlugRelatedField dla pośrednio pokrewnego atrybutu?
from django.db import models
from django.contrib.auth.models import User as DjangoUser
class Account(models.Model):
name = models.CharField(max_length=200, db_index=True)
class Profile(models.Model):
django_user = models.OneToOneField(DjangoUser)
default_account = models.ForeignKey(Account)
class Permission(models.Model):
# Which user has the permission
user = models.ForeignKey(Profile, db_index=True)
# Which account they have the permission on
account = models.ForeignKey(Account, db_index=True)
chcę zrobić serializatora o zgodę, że będą tworzyć obiekty, takie jak ten:
{
"user": "[email protected]",
"account": 123
}
gdzie wartość "konta" jest kluczem podstawowym konta (więc łatwo, mogę użyć PrimaryKeyRelatedField), a wartość "użytkownika" to adres e-mail użytkownika (jest to część, której jeszcze nie znałem, ponieważ adres e-mail jest nie przechowywane bezpośrednio w obiekcie Profile, znajduje się w powiązanym obiekcie DjangoUser). Zauważ też, że nie jest to tylko do odczytu - podczas tworzenia uprawnienia musi być możliwa deserializacja z adresu e-mail do obiektu profilu.
Niektóre rzeczy próbowałem tak daleko, za reprezentowanie użytkownika na serializatora Permission ...
1.
user = serializers.RelatedField(read_only=False)
Z tym jednym, jeśli POST adres e-mail (lub klucz podstawowy lub cokolwiek innego) jako "użytkownik", zwraca błąd 400, mówiąc: {"user": "This field is required."}
, tak jakbym w ogóle nie uwzględniał pola.
2.
user = serializers.SlugRelatedField(slug_field='django_user.email')
Z tym jednym, mam AttributeError: 'Profile' object has no attribute 'django_user.email'
. To samo dzieje się, gdy używam 'django_user__email'
.
Wszelkie pomysły?
Pytanie to wyraźnie mówi, że powoduje to AttributeError. – Avril