djangodjango-modelsdjongo

Djongo isn't using my explicitly set primary key in Django models


Djongo using "id" as primary_key even though it is already explicitly set in model

below is my model, where ive explicitly set a primary key for each model.

class searchPlayers(models.Model):
    name = models.CharField(max_length=200,default='')
    playerId = models.CharField(max_length=200,primary_key=True)
    LP = models.IntegerField(default=0)
    add_date = models.DateTimeField('date')
    
class Matches(models.Model):
    matchID = models.CharField(max_length=200,primary_key=True)
    otherParticipants = models.CharField(max_length=200, default='')
    placement = models.IntegerField(default=0)
    game_time = models.CharField(max_length=20, default='')
    game_length = models.CharField(max_length=20, default='')

    searchedPlayer= models.ForeignKey(searchPlayers, on_delete=models.CASCADE,default=None)

class Traits(models.Model):
    matchID = models.CharField(max_length=200,primary_key=True)
    traitname = models.CharField(max_length=100, default='')
    currenttier = models.IntegerField(default=0)
    tierunits = models.IntegerField(default=0)

    associatedMatch = models.ForeignKey(Matches,on_delete=models.CASCADE,default=None)

class Champions(models.Model):
    matchID = models.CharField(max_length=200,primary_key=True)
    Name = models.CharField(max_length=20, default='')
    Star = models.IntegerField(default=1)
    Items = models.CharField(max_length=100, default='') #will have to delineate with commas
    Rarity = models.IntegerField(default=0)

    associatedMatch = models.ForeignKey(Matches,on_delete=models.CASCADE,default=None)

and yet when i view on Mongo compass: Mongocompass the primary key is still the "id" field.

ive tried deleting all my migrations, django.migrations and completely dumped my entire model. Any ideas for why the primary key isnt being properly set?


Solution

  • An id field is automatically generated when you run migrations in Django. so in your case if you want a character field as primary key you can override the id field in all models.

    for example:

    class searchPlayers(models.Model):
    id = models.CharField(max_length=200,primary_key=True)
    name = models.CharField(max_length=200,default='')
    LP = models.IntegerField(default=0)
    add_date = models.DateTimeField('date')
    

    first delete your old migrations files and then make your all models like this.