如何查看用户在其用户序列化器中发布的广告

时间:2019-07-20 09:35:48

标签: django django-models django-rest-framework serializer

我有一个用户序列化器,我需要在每个用户序列化器中显示他发布的详细广告 models.py:

    class Advertise(models.Model):

    title       = models.CharField(max_length=120)
    publisher   = models.ForeignKey(User, related_name='publisher',null=True, blank=True, on_delete=models.CASCADE)
    category    = models.CharField(choices=CATEGORIES, max_length=120)
    description = models.TextField(max_length= 200, null=True, blank=True)
    image       = models.ImageField(upload_to='project_static/Advertise/img', null=True, blank=False)
    price       = models.DecimalField(decimal_places=2, max_digits=20)
    timestamp   = models.DateTimeField(auto_now_add=True)
    approved    = models.BooleanField(default=False)
    location    = models.CharField(max_length=120 , null=True, blank=True)
    contact     = models.CharField(max_length=120,null=True, blank=True)

    def __str__(self):
        """show ad name in admin page"""
        return self.title


    def get_absolute_url(self):

        return reverse("advertise:advertise-detail", kwargs={"pk":self.pk})

serilaizers.py:

class AdSerializer(serializers.HyperlinkedModelSerializer):
    publisher = serializers.ReadOnlyField(source='publisher.username')
    url       = serializers.CharField(source='get_absolute_url')

    class Meta:
        model  = Advertise
        fields = ('url','id','title','publisher','category','description','price','timestamp','approved','location','contact')
class UserSerializer(serializers.HyperlinkedModelSerializer):
    publisher = AdSerializer(source='publisher_set', many=True)
    class Meta:
        model  = User
        fields = ['id', 'username','publisher']

错误: 尝试获取序列化程序publisher上字段UserSerializer的值时,出现AttributeError。 序列化程序字段的名称可能不正确,并且与User实例上的任何属性或键都不匹配。 原始异常文本为:“用户”对象没有属性“发布集”。

1 个答案:

答案 0 :(得分:0)

好,我通过一些更改解决了该问题:

class AdSerializer(serializers.HyperlinkedModelSerializer):
    publisher = serializers.ReadOnlyField(source='publisher.username')
    url = serializers.HyperlinkedIdentityField(view_name='advertise:ad_detailview', source='Advertise')

    class Meta:
        model  = Advertise
        fields = ('url','id','title','publisher','category','description','price','timestamp','approved','location','contact')

class UserSerializer(serializers.HyperlinkedModelSerializer):
    publisher_of = AdSerializer(many=True)
    url = serializers.HyperlinkedIdentityField(view_name='advertise:user-detail', source='User')
    class Meta:
        model  = User
        fields = ('url', 'id','username', 'email', 'publisher_of')

也在models.py发布者字段中获得了related_name =“ publisher_of”以获得更多的对称性 该链接帮助 https://www.django-rest-framework.org/tutorial/5-relationships-and-hyperlinked-apis/