Django 'POST', возвращающий объект 'Subscriber', не имеет атрибута 'title'
Я пытаюсь отправить POST-запрос для добавления "подписчика" в мою базу данных. Запрос POST проходит без ошибок.
Я размещаю это
{
"email":"email@app.com","campaign":1
}
и возвращается
{
"id": 2,
"email": "email@app.com",
"created_at": "2022-08-02T19:49:55.509018Z",
"updated_at": "2022-08-02T19:49:55.509018Z",
"campaign": 1
}
ID равен 2, потому что это второй ПОСТ, который я сделал
Это мой класс подписчиков
class Subscriber(models.Model):
campaign = models.ForeignKey(to = Campaign, on_delete=models.CASCADE)
email = models.EmailField(max_length=254)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Meta:
ordering=('-created_at',)
def __str__(self):
return self.title()
Это мой класс кампании
class Campaign(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
slug = models.SlugField(max_length=255, null = True, blank = True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
logo = CloudinaryField('Image', overwrite=True, format="jpg")
class Meta:
ordering=('-created_at',)
def __str__(self):
return self.title
def save(self, *args, **kwargs):
to_assign=slugify(self.title)
if Campaign.objects.filter(slug=to_assign).exists:
to_assign = to_assign + str(Campaign.objects.all().count())
self.slug = to_assign
super().save(*args, **kwargs)
А вот мои текущие Serializers.py
class CampaignSerializer(serializers.ModelSerializer):
class Meta:
model = Campaign
fields = "__all__"
class SubscriberSerializer(serializers.ModelSerializer):
class Meta:
model = Subscriber
fields = "__all__"
My Views.py
class CampaignListAPIView(generics.ListAPIView):
serializer_class=CampaignSerializer
def get_queryset(self):
return Campaign.objects.all()
class CampaignDetailAPIView(generics.GenericAPIView):
serializer_class=CampaignSerializer
def get(self, request, slug):
#serialize the below python object!
query_set = Campaign.objects.filter(slug=slug).first()
if query_set:
# If you're serializng more than 1 instance use query_set, many=True
# .data gives you the serialied version
return response.Response(self.serializer_class(query_set).data)
return response.Response('Not Found', status=status.HTTP_404_NOT_FOUND)
class SubscriberToCampaignAPIView(generics.CreateAPIView):
serializer_class=SubscriberSerializer
#When you create it needs to use a get queryset
def get_queryset(self):
return Subscriber.objects.all()
Когда я захожу в панель администратора по адресу /admin и нажимаю на моих подписчиков, то получаю ошибку
AttributeError at /admin/Campaigns/subscriber/ У объекта 'Subscriber' нет атрибута 'title'
И я не могу просмотреть размещенную информацию.
Если я удалю
def __str__(self):
return self.title()
Из моего класса подписчика, он работает, однако, он отображается как Объект подписчика (1) В базе данных, вместо имени электронной почты
Так,
- Нужно ли удалять
def __str__(self):
return self.title()
От моего класса подписчиков?
- Как сделать так, чтобы именем объекта в базе данных было само письмо?
У подписчика нет поля title
или атрибута, отсюда и ошибка. Вам нужно вернуть один из его атрибутов или атрибут кампании (у которой есть атрибут title
), например:
def __str__(self):
return self.email
# or
def __str__(self):
return self.campaign.title