I am having the following custom user model trying to use the 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 = ['company_name','website'] class Meta: verbose_name = _('Merchant') verbose_name_plural = _('Merchants') def __unicode__(self): return self.company_name
The model works perfectly and database is as expected, but the
problem is when I try to dumpdata to create fixtures for my tests.
python manage.py dumpdata --natural --exclude=contenttypes --exclude=auth.permission --indent=4 > fixtures/initial_data.json
Then I get the error:
CommandError: Unable to serialize database: <Merchant: Test Shop> is not JSON serializable
Do you have ideas what could be the reason for this. Could it be the charfield primary key or something with the abstractbaseuser model?
Thanks
* Do you have any models with foreign keys to your custom user? (i.e., is the problem manifesting when serialising Merchant, or serialising foreign keys to Merchant?)
As a side note -- if you're using email as your username field, you should set it as unique=True -- USERNAME_FIELD needs to be unique or you'll experience problems later on. This is something that should probably be caught by validation - which is a bug deserving of it's own report. For performance reasons, you also probably want to set it db_index=True, since you're going to be searching on that field fairly often, so having an index on it makes sense.
Hi Russell,
Thanks for the responce! I actually found the problem it was not where I was looking for it and it was more of a typo.
And your suggestion No.2 appears to be right:I am having a Product model with foreignkey to the Merchant model which had natural key method defined as follows:* Do you have any models with foreign keys to your custom user? (i.e., is the problem manifesting when serialising Merchant, or serialising foreign keys to Merchant?)
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)
The natural_key method returned self.merchant instead of self.merchant_id so it was trying to serialize the whole merchant object to make a natural key. After switching this to merchant_id it is working properly.
Thanks for the notes I will for sure add these, but shouldn't both(unique and db_index) be added by default when you set your USERNAME_FIELD .As a side note -- if you're using email as your username field, you should set it as unique=True -- USERNAME_FIELD needs to be unique or you'll experience problems later on. This is something that should probably be caught by validation - which is a bug deserving of it's own report. For performance reasons, you also probably want to set it db_index=True, since you're going to be searching on that field fairly often, so having an index on it makes sense.
Exception Value: | invalid literal for int() with base 10: '3DDz0Vi7zonFDq9JfByKkeparghaWwupVwbMCbL7JHo' |
---|---|
Exception Location: | /usr/local/lib/python2.7/dist-packages/django/db/models/fields/__init__.py in get_prep_value, line 554 |
I can easily find workaround for that problem by writing custom decorator for example but I am not sure this is supposed to be this way. Or may be I am missing something here ?
Thanks,
Kaloian
--
You received this message because you are subscribed to the Google Groups "Django users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to django-users...@googlegroups.com.
To post to this group, send email to django...@googlegroups.com.
Visit this group at http://groups.google.com/group/django-users?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.