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) В базе данных, вместо имени электронной почты

Так,

  1. Нужно ли удалять
def __str__(self):
        return self.title()

От моего класса подписчиков?

  1. Как сделать так, чтобы именем объекта в базе данных было само письмо?

У подписчика нет поля title или атрибута, отсюда и ошибка. Вам нужно вернуть один из его атрибутов или атрибут кампании (у которой есть атрибут title), например:

def __str__(self):
    return self.email

# or

def __str__(self):
    return self.campaign.title
Вернуться на верх