Come si esclude la chiave primaria dal JSON prodotta dal dumpdata di Django quando le chiavi naturali sono abilitate?Esclusione della chiave primaria in Django dumpdata con chiavi naturali
Ho creato un record che mi piacerebbe "esportare" in modo che altri possano usarlo come modello, caricandolo in un database separato con lo stesso schema senza entrare in conflitto con altri record nello stesso modello.
Come ho capito il supporto di Django per le chiavi naturali, questo sembra quello che gli NK sono stati progettati per fare. Il mio record ha un campo unico name
, che viene utilizzato anche come chiave naturale.
Così quando ho eseguito:
from django.core import serializers
from myapp.models import MyModel
obj = MyModel.objects.get(id=123)
serializers.serialize('json', [obj], indent=4, use_natural_keys=True)
vorrei aspettare un qualcosa di output come:
[
{
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
che ho potuto quindi caricare in un altro database, utilizzando loaddata, in attesa di essere assegnato dinamicamente un nuova chiave primaria. Nota che il mio campo "create_user" è un FK per l'auth.User model di Django, che supporta le chiavi naturali e che emette come sua chiave naturale al posto della chiave primaria intera.
Tuttavia, ciò che è generato è in realtà:
[
{
"pk": 123,
"model": "myapp.mymodel",
"fields": {
"name": "foo",
"create_date": "2011-09-22 12:00:00",
"create_user": [
"someusername"
]
}
}
]
che sarà chiaramente in conflitto con e sovrascrivere qualsiasi record esistente con chiave primaria 123.
Qual è il modo migliore per risolvere questo problema? Non voglio modificare retroattivamente tutti i campi dei numeri interi della chiave primaria generati automaticamente a prescindere dalle chiavi naturali equivalenti, dal momento che ciò causerebbe un impatto sulle prestazioni oltre ad essere laborioso.
Edit: Questo sembra essere a bug che era reported ... 2 anni fa ... ed è stato in gran parte ignorato ...
Questa è esattamente la soluzione che ho scoperto io stesso. – Cerin
Sembra che tu possa omettere il campo 'pk' anche in json ora. – hop