hemo
hemo

Reputation: 110

Error initialising model with UUIDField django

Problem :

So, I have been trying to make an object of the model Trade with an initial value to the identifier from my custom function gen_rand_string().

But the problem is when, I am initialising it.

If I remove the initializer and set the UUIDField to NULL, it works out to be fine.

This is the error, I am getting :

TypeError at /admin/account/trade/add/

int() argument must be a string or a number, not 'Trade'

My Trade class :

class Trade(models.Model):
    NEW_TRADE = 'N'
    CANCELLED_TRADE = 'C'
    PENDING_TRADE = 'P'
    STATUS_OF_TRADE = (
        (NEW_TRADE, "New"),
        (CANCELLED_TRADE, "Cancelled"),
        (PENDING_TRADE, "Pending")
    )
    TYPE_BUY = 'B'
    TYPE_SELL = 'S'
    TYPE_OF_TRADE = (
        (TYPE_BUY, "Buy"),
        (TYPE_SELL, "Sell")
    )
    user = models.OneToOneField('UserProfile', related_name='trades')
    identifier = models.UUIDField(null=False, editable=False)
    created_at = models.DateTimeField(auto_now_add=True, editable=False)
    finished_at = models.DateTimeField(auto_now_add=True)
    amount = models.DecimalField(max_digits=19, decimal_places=10, null=False)
    type = models.CharField(max_length=2, choices=TYPE_OF_TRADE, null=False)
    status = models.CharField(max_length=2, choices=STATUS_OF_TRADE, default=PENDING_TRADE, null=False)

    def __init__(self, *args, **kwargs):
        self.identifier = gen_rand_string()
        super(Trade, self).__init__(self, *args, **kwargs)

    class Meta:
        ordering = ('created_at',)

    def __unicode__(self):
        return self.identifier

    def __str__(self):
        return self.identifier

My gen_rand_string() :

def gen_rand_string(purpose=''):
    if purpose:
        return purpose + '_' + get_random_string(length=64 - len(purpose))
    else:
        return get_random_string(length=64)

Suggestions :

I am making a random string for each trade in not a better way, would someone suggest somewhat better option, or something they would have it in their place.

I am using python 2.7 which is the reason of my initialisation of the object in a different way

Thanks.

Upvotes: 0

Views: 875

Answers (2)

Sumeet Kumar
Sumeet Kumar

Reputation: 1019

problem is with your init function syntax.

def __init__(self, *args, **kwargs):
    super(Trade, self).__init__(self, *args, **kwargs)
    self.identifier = gen_rand_string()

Upvotes: 0

Alasdair
Alasdair

Reputation: 309029

You are discouraged from overriding __init__ for Django models. You use your gen_rand_string as the field's default:

identifier = models.UUIDField(null=False, editable=False, default=gen_rand_string)

However you probably don't need to define your own gen_rand_string method - just use uuid.uuid4, as in docs for UUIDField.

identifier = models.UUIDField(null=False, editable=False, default=uuid.uuid4)

Upvotes: 1

Related Questions