Я хочу создать веб-приложение, подобное udemy, и использовать структуру django rest для бэкэнда и mysql в качестве базы данных. У меня есть модель под названием «Уроки», которая содержит список всех уроков, и одно из полей - «ссылка на видео». Также у меня есть другие названия моделей Purchases, у которых есть два поля ForeignKey: Users и Lessons. Я хочу показать Уроки всем пользователям, но для поля загрузки мне нужно найти пару (Пользователь, Урок) в Покупках, и если у него есть курс, я покажу ему поле загрузки.
class LessonsViewSet(viewsets.ModelViewSet):
queryset = models.Assignments.objects.all()
authentication_classes = (TokenAuthentication,)
def get_serializer_class(self):
if self.request.user.is_staff :
print(self.request.user)
return serializers.FullAccessLessonsSerializer
elif self.request.user.is_active:
return serializers.PartialAccessLessonsSerializer
print(self.request.user)
return serializers.BasicAccessLessonsSerializer
Полный доступ для админов:
class FullAccessLessonsSerializer(serializers.ModelSerializer):
class Meta:
model = models.Assignments
fields = ('id', 'title', 'description', 'dllink' )
Базовый доступ для неаутентифицированных пользователей:
class BasicAccessLessonsSerializer(serializers.ModelSerializer):
class Meta:
model = models.Assignments
fields = ('id', 'title', 'description')
и частичный доступ для студентов:
class PartialAccessAssignmentsSerializer(serializers.ModelSerializer):
"""A serializer for all Lessons"""
def __init__(self, *args, **kwargs):
fields = kwargs.pop('fields', None)
super(PartialAccessAssignmentsSerializer, self).__init__(*args,**kwargs)
print(self.fields.get('id'))
self.fields.pop('dllink')
class Meta:
model = models.Assignments
fields = ('id','title','description','dllink' )
Я сделал все, что мог, но не могу понять. Я либо получаю ошибку, либо удаляю все ссылки dl.
это немного сбивает с толку. Вы говорите об уроках моделей и покупках, но в своем коде вы используете только присвоения модели. Так что непонятно, какие поля откуда вы хотите показывать и при каких условиях. Я бы порекомендовал сделать его немного понятнее и также включить модели.
@HenryWoody Я получил ответ от Ykh. Спасибо . Нет, я хотел вернуть dllink условно, в зависимости от того, приобрел ли уже курс запрашивающий пользователь.
@EnthusiastMartin. да, извините за это. я хотел сделать это простым. я разместил всего несколько строк кода. возможно, мне тоже пришлось выложить свои модели. это был мой первый вопрос в stackoverflow. Спасибо за ваш комментарий.
Если вы хотите, чтобы dllink был None, когда пользователь не может получить доступ. Используйте это:
class FullAccessLessonsSerializer(serializers.ModelSerializer):
dllink = serializers.SerializerMethodField()
def get_prescription_accept(self, instance):
result = True # lookup the pair (User , Lesson) in Purchases
if result:
return instance.dllink
else:
return ''
class Meta:
model = models.Assignments
fields = ('id', 'title', 'description', 'dllink' )
Если вы хотите извлекать DLL из данных, используйте:
class FullAccessLessonsSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
data = super(FullAccessLessonsSerializer, self).to_representation(instance)
result = True # lookup the pair (User , Lesson) in Purchases
if not result:
data.pop('dllink')
return data
class Meta:
model = models.Assignments
fields = ('id', 'title', 'description', 'dllink' )
Итак, хотите ли вы вернуть
dllink
условно, в зависимости от того, загрузил ли запрашивающий пользователь задания?