Django: Create fixtures without specifying a primary key?

DjangoFixtures

Django Problem Overview


One of the things that bugs me about Django fixtures is that you've got to specify every model's primary key. Is there any way to create fixtures without having to specify a primary key for each row?

Django Solutions


Solution 1 - Django

Use "pk: null" instead of "pk: 1" (or whatever), which will result in the PK being set to None, and when the object is saved a primary key will be assigned.

This works for YAML at least, I'm guessing you're using that if you are creating by hand.

Solution 2 - Django

You should have a look at Natural Keys if you're wiling to add relation without using pk's

https://docs.djangoproject.com/en/dev/ref/django-admin/#dumpdata-app-label-app-label-app-label-model

Solution 3 - Django

If you check out the manage.py dumpdata command, you will see some options called --natural-foreign, --natural-primary. If you look at the output you can see that the objects are dumped without using primary keys or foreign keys.

Solution 4 - Django

A friend of mine suggested the fixture module: http://farmdev.com/projects/fixture/

Solution 5 - Django

I had to deal with existing DB schema without possibility to change it, so I need a table with complex primary key or without it at all - but not with the serial one. What I did:

I've specified a primary_key=True to the field, which should not be unique at all and wrote overloaded method:

class ContraIndicationsMedicines(models.Model):

    contra_indication = models.ForeignKey(ContraIndication, primary_key=True)
    medicine = models.ForeignKey(Medicine)

    def validate_unique(self, exclude=None): 
        pass

In fact, it worked for my needs, but there are more validations call inside django.contib.admin.* and not all the inlines e.t.c are guaranteed to work. That was the only solution I could implement... ((

Solution 6 - Django

natural primary key

With a natural primary key (where the model field option is set to "primary_key=True") you can easily leave out the specification of the primary key in your fixture. Django will automatically check for the natural primary key then and there is no risk of adding duplicate entries.

auto primary key (not manually defined pk)

When there is an automatic primary key the only option I see here is to dump the data and edit the entries with a script or set new entries' primary key to null as stated by @spookylukey.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDavid WoleverView Question on Stackoverflow
Solution 1 - DjangospookylukeyView Answer on Stackoverflow
Solution 2 - DjangoEduardoView Answer on Stackoverflow
Solution 3 - DjangomolecularView Answer on Stackoverflow
Solution 4 - DjangoDavid WoleverView Answer on Stackoverflow
Solution 5 - DjangoAndrey BelyakView Answer on Stackoverflow
Solution 6 - Djangocyc8View Answer on Stackoverflow