【问题标题】:Django AttributeError:'Campaign' object has no attribute 'ads'Django AttributeError:'Campaign' 对象没有属性'ads'
【发布时间】:2016-10-11 10:57:57
【问题描述】:

我正在尝试在 Django Rest Framework 中创建嵌套序列化程序,但我不断收到此错误。我知道它为什么会抛出它,但是,我认为 Django 会处理一对多的关系。

/api/campaigns 中的 AttributeError 尝试在序列化程序 CampaignSerializer 上获取字段 ads 的值时出现 AttributeError。 序列化程序字段可能命名不正确,并且与 Campaign 实例上的任何属性或键都不匹配。 原始异常文本是:“Campaign”对象没有“ads”属性。

class Campaign(models.Model):

    name = models.CharField(max_length = 30)
    type = models.CharField(max_length = 20)
    start_date = models.DateField(auto_now=False, auto_now_add=True)
    end_date = models.DateField(auto_now=False, auto_now_add=True)
    locations = models.CharField(max_length = 30)
    budget = models.IntegerField()
    land_page = models.URLField()
    keywords = models.TextField()
    CPM = models.IntegerField()
    CPC = models.IntegerField()
    description = models.TextField()
    commission = models.IntegerField()
    pay_off = models.IntegerField()
    advertiser = models.ForeignKey(User)
    date_time = models.DateField(auto_now=False, auto_now_add=True)

class Meta:
    db_table = "campaigns"

class ADS(models.Model):

    advertiser = models.ForeignKey(User)
    campaign = models.ForeignKey(Campaign)
    headline = models.CharField(max_length=50)
    description_1 = models.TextField(blank=True)
    description_2 = models.TextField(blank=True)
    display_url = models.URLField(blank=True)
    final_url = models.URLField(blank=True)
    mobile_url = models.URLField(blank=True)


class Meta:
    db_table = "ads"

这些是我的序列化程序

class ADSerializer(serializers.ModelSerializer):

    adsImages = AdsImagesSerializer(read_only=True,many=True)

class Meta:
    model = ADS
    fields = ("headline","description_1","description_2","display_url","final_url","mobile_url","advertiser","adsImages")


class CampaignSerializer(serializers.ModelSerializer):

    advertiser = AdvertiserProfile(read_only=True,required=False)
    ads = ADSerializer(many=True)

class Meta:
    model = Campaign
    fields = ("name","type","start_date","end_date","locations","budget","land_page","keywords","CPM","CPC","description","commission","pay_off","ads","advertiser",)

def get_validation_exclusions(self, *args, **kwargs):
    exclusions = super(CampaignSerializer,self).get_validation_exclusions()

    return exclusions + ['advertiser']

def create(self, validated_data):
    ads_data = validated_data.pop('ads')
    campaign = Campaign.objects.create(**validated_data)
    for ad_data in ads_data:
        ADS.objects.create(campaign=campaign, **ad_data)
    return campaign

【问题讨论】:

    标签: python angularjs django django-rest-framework


    【解决方案1】:

    我刚刚解决了这个问题,在模型中有一个相关的名称

    campaign = models.ForeignKey(Campaign, related_name="ads")
    

    我认为它上次不起作用,因为如果没有相关名称,反向关系就不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-22
      • 2018-02-11
      • 2015-03-24
      • 2018-01-14
      • 2018-07-31
      • 2021-01-12
      相关资源
      最近更新 更多