0

我有以下自定义用户模型尝试使用 Django 1.5 AbstractBaseUser:

class Merchant(AbstractBaseUser): 
    email = models.EmailField()
    company_name = models.CharField(max_length=256)
    website = models.URLField()
    description = models.TextField(blank=True)
    api_key = models.CharField(blank=True, max_length=256, primary_key=True)   

    USERNAME_FIELD = 'email' 
    REQUIRED_FIELDS = ['email','website']


   class Meta:
        verbose_name = _('Merchant')
        verbose_name_plural = _('Merchants')

   def __unicode__(self):
        return self.company_name 

该模型运行良好,数据库符合预期,但问题是当我尝试转储数据为我的测试创建夹具时。

python manage.py dumpdata --natural --exclude=contenttypes --exclude=auth.permission --indent=4 > fixtures/initial_data.json

然后我得到错误:

CommandError: Unable to serialize database: <Merchant: Test Shop> is not JSON serializable

你有什么想法可能是什么原因。它可能是 charfield 主键还是带有 abstractbaseuser 模型的东西?

谢谢

4

1 回答 1

0

花了一些时间后,我发现了问题。实际上,它不是在 Merchant 模型中,而是在具有 Merchant 外键的 Product 中:

class Product(models.Model):
    name = models.CharField(max_length=200)
    #merchant = models.ForeignKey(Merchant, to_field='api_key')
    merchant = models.ForeignKey(Merchant)
    url = models.URLField(max_length = 2000)  
    description = models.TextField(blank=True) 
    client_product_id = models.CharField(max_length='100')

    objects = ProductManager() 
    class Meta:
        verbose_name = 'Product'
        verbose_name_plural = 'Products' 
        unique_together = ('merchant', 'client_product_id',) 

    def __unicode__(self):
        return self.name 

    def natural_key(self):
        return (self.merchant, self.client_product_id) 

模型中的 natural_key 方法返回 self.merchant 而不是 self.merchant_id,因此它试图序列化整个商家对象以创建自然键。将 natural_key 方法切换到以下方法后,问题得到了修复:

def natural_key(self):
    return (self.merchant_id, self.client_product_id)
于 2013-02-18T11:36:19.730 回答