How to real named auth_group_permissions in Django? - python

I want to create fixtures for auth_group_permissions table, but how named it model?
'auth.group.permissions' is not right.
[
{
"model": "auth.group",
"pk": 1,
"fields": {"name": "manager"}
},
{
"model": "auth.group",
"pk": 2,
"fields": {"name": "executive"}
},
{
"model": "auth.group",
"pk": 3,
"fields": {"name": "ordinar"}
},
{
"model": "auth.group.permissions",
"pk": 1,
"fields": {
"group_id": 1,
"permission_id": 7
}
}
]

You can define them in the group as related field
"model": "auth.group",
"fields": {
"name": "foo",
"permissions": [
...
]

There is no model named group.permissions in auth app. But class Group has many-to-many field permissions, so you should use it for your purpose.
Try this fixture:
{
"model": "auth.group",
"pk": 1,
"fields": {
"name": "manager",
"permissions" : [7]
}
}

Related

How to copy data from fixtures to tenant schema table in Django-tenants?

Info: I am using django-tenants. I want to copy data from fixtures file to tenant schema table while creating new tenant. django-celery is handling the task. I want to run fixtures_data_load function after new tenant has been created
I don't understand how can i do that!
app.task()
def fixtures_data_load(self):
with open('fixtures/groups.json', encoding='utf-8') as data_file:
# Convert json string to python object
data = json.loads(data_file.read())
# Create model instances for each item
for item in data:
# create model instances...
item = YourModel(*item)
YourModel.objects.bulk_create(items)
fixtures.json
[
{
"model": "auth.group",
"pk": 1,
"fields": {
"name": "admin",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 2,
"fields": {
"name": "producer",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 3,
"fields": {
"name": "copy editor",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 4,
"fields": {
"name": "reporter",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 5,
"fields": {
"name": "anchor",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 6,
"fields": {
"name": "nle",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 7,
"fields": {
"name": "ticker oprator",
"permissions": []
}
},
{
"model": "auth.group",
"pk": 8,
"fields": {
"name": "assignment editor",
"permissions": []
}
}
]

Django loaddata ignore existing objects

I have a fixture with list of entries. eg:
[
{
"fields": {
"currency": 1,
"price": "99.99",
"product_variant": 1
},
"model": "products.productprice",
"pk": 1
},
{
"fields": {
"currency": 2,
"price": "139.99",
"product_variant": 1
},
"model": "products.productprice",
"pk": 2
}
]
This is only initial data for each entry (The price might change). I would like to be able to add another entry to that fixture and load it with loaddata but without updating entries that already exist in the database.
Is there any way to do that? Something like --ignorenonexistent but for existing entries.
If you keep pk in the json like that, you will always overwrite the first two records in product.productprice.
I would use "pk: null".
This way, you will always create new record with every load.
So if you want to create a new price:
[
{
"fields": {
"currency": 1,
"price": "99.99",
"product_variant": 1
},
"model": "products.productprice",
"pk": 1
},
{
"fields": {
"currency": 2,
"price": "139.99",
"product_variant": 1
},
"model": "products.productprice",
"pk": 2
},
{
"fields": {
"currency": 4,
"price": "9.99",
"product_variant": 1
},
"model": "products.productprice",
"pk": null
}
]
The first two records are always be the same, but if you already added a third one ( pk:3 ) with the last section you will create a new productprice with pk: 4.
BTW: if your currency field is an other primary key(with autoincrement), you can put "null" there too, a new primary key will be generated.

Django rest framework: convert queryset to json response

I have two models, Appointment and EmployeeEvent. I need to get data from these models and combine the result in to a single get api request.
urls.py
url(r'^calenderevents', calender_events)
views.py
#api_view(['GET'])
def calender_events(request):
queryset1 = Appointment.objects.all()
queryset2 = EmployeeEvent.objects.all()
return Response({'Appointments':json.loads(serializers.serialize('json', queryset1)), 'EmployeeEvents': json.loads(serializers.serialize('json', queryset2))})
When I call the API, I am getting the result, but it includes some unwanted keys like "pk", "model", "fields" etc. Also in the appoinments result, I need the full customer object instead of the customer id. Is there any way to specify the CustomerSerializer along with the query set?
Results am getting
{
"Appointments": [
{
"pk": "33a0fffb-326e-4566-bfb4-b146a87a4f3f",
"model": "appointment.appointment",
"fields": {
"customer": "25503315-8bac-4070-87c1-86bf0630c846",
"status": "Requested",
"description": "Assigned appointment",
}
},
{
"pk": "9da806f5-77f1-41e6-a745-7be3f79d6f7a",
"model": "appointment.appointment",
"fields": {
"customer": "25503315-8bac-4070-87c1-86bf0630c846",
"status": "Requested",
"description": "Assigned appointment",
}
}
],
"EmployeeEvents": [
{
"pk": "f76b5de0-1ab8-4ac3-947d-15ba8941d97d",
"model": "employee_event.employeeevent",
"fields": {
"event_name": "New Event",
"start_date": "2017-02-17",
"end_date": "2017-02-22"
}
},
{
"pk": "56f02290-370e-426c-951e-a93c57fde681",
"model": "employee_event.employeeevent",
"fields": {
"event_name": "New Event",
"start_date": "2017-02-02",
"end_date": "2017-03-22"
}
}
]
}
Expected Result
{
"Appointments": [
{
"id": "33a0fffb-326e-4566-bfb4-b146a87a4f3f",
"customer": {
"id": "25503315-8bac-4070-87c1-86bf0630c846",
"firstname": "Customre 1",
"photo_url": "imagepath",
},
"status": "Requested",
"description": "Assigned appointment"
},
{
"id": "9da806f5-77f1-41e6-a745-7be3f79d6f7a",
"customer": {
"id": "15ba8941d97d-8bac-4070-87c1-86bf0630c846",
"firstname": "Customre 2",
"photo_url": "imagepath",
},
"status": "Requested",
"description": "Assigned appointment"
},
}
],
"EmployeeEvents": [
{
"id": "f76b5de0-1ab8-4ac3-947d-15ba8941d97d",
"event_name": "New Event 1",
"start_date": "2017-02-17",
"end_date": "2017-02-22"
},
{
"id": "56f02290-370e-426c-951e-a93c57fde681",
"event_name": "New Event 2”,
"start_date": "2017-02-17",
"end_date": "2017-02-22"
}
]
}
You need to write a serializer to display the data in the desired format. Read the excellent tutorial to guide you though it properly. But if you want a quick hacky answer, then do something like this:
serializer = AppointmentSerializer(Appointment.objects.all(), many=True)
return Response(serializer.data)
Where the serializer looks something like this:
class AppointmentSerializer(serializers.ModelSerializer):
customer = CustomerSerializer(required=False, allow_null=True)
class Meta:
model = Appointment
fields = ('id', 'customer', 'status', 'etc...')
related_object = 'customer'
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = ('id', 'first_name', 'etc...')
Edit: updated to include example of a related object

Django loaddata UNIQUE constraint failed

I'm running python manage.py loaddata 'path/to/mydata.json' with an empty database (User and UserProfile tables are created but not populated), however, I'm getting the following error:
django.db.utils.IntegrityError: Problem installing fixture 'path/to/mydata.json': Could not load myapp.UserProfile(pk=1): UNIQUE constraint failed: myapp_userprofile.user_id
I checked (even after running this command) and the database is not populated at all. So how can it be giving an error that the pk is not unique?
If relevant, UserProfile just extends the default User model with a OneToOneField relation, as proposed here.
Here is what mydata.json contains:
[
{
"model": "auth.user",
"pk": 1,
"fields": {
"password": "pbkdf2_sha256..",
"last_login": "2016-10-22T15:19:46.926Z",
"is_superuser": true,
"username": "thesuperuser",
"first_name": "",
"last_name": "",
"email": "a#a.co",
"is_staff": true,
"is_active": true,
"date_joined": "2016-10-22T14:48:27.394Z",
"groups": [],
"user_permissions": []
}
},
{
"model": "auth.user",
"pk": 2,
"fields": {
"password": "pbkdf2_sha256..",
"last_login": null,
"is_superuser": false,
"username": "user1",
"first_name": "User",
"last_name": "One",
"email": "",
"is_staff": false,
"is_active": true,
"date_joined": "2016-10-22T15:20:32Z",
"groups": [],
"user_permissions": []
}
},
{
"model": "auth.user",
"pk": 4,
"fields": {
"password": "pbkdf2_sha256..",
"last_login": null,
"is_superuser": false,
"username": "user3",
"first_name": "User",
"last_name": "Three",
"email": "",
"is_staff": false,
"is_active": true,
"date_joined": "2016-10-22T15:21:09Z",
"groups": [],
"user_permissions": []
}
},
{
"model": "auth.user",
"pk": 3,
"fields": {
"password": "pbkdf2_sha256..",
"last_login": null,
"is_superuser": false,
"username": "user2",
"first_name": "User",
"last_name": "Two",
"email": "",
"is_staff": false,
"is_active": true,
"date_joined": "2016-10-22T15:21:03Z",
"groups": [],
"user_permissions": []
}
},
{
"model": "myapp.userprofile",
"pk": 1,
"fields": {
"user": 1,
"money": 100
}
},
{
"model": "myapp.userprofile",
"pk": 2,
"fields": {
"user": 2,
"money": 100
}
},
{
"model": "myapp.userprofile",
"pk": 3,
"fields": {
"user": 3,
"money": 100
}
},
{
"model": "myapp.userprofile",
"pk": 4,
"fields": {
"user": 4,
"money": 100
}
}
]
Thanks for any help,
Exclude ContentType and Auth Permissions objects when creating a db dump.
python manage.py dumpdata --natural-foreign --natural-primary -e contenttypes -e auth.Permission --indent 2 > dump.json
After that you should be able to run the command without any issue
python manage.py loaddata dump.json
Credit to
https://www.coderedcorp.com/blog/how-to-dump-your-django-database-and-load-it-into-/
for saving my day
Today (24th, April, 2020) I had a similar problem with Django 2.2
My fixtures file was as simple as this:
[
{
"model": "contenttypes.contenttype",
"pk": 1,
"fields": {
"app_label": "admin",
"model": "logentry"
}
},
{
"model": "contenttypes.contenttype",
"pk": 2,
"fields": {
"app_label": "auth",
"model": "permission"
}
}]
When I ran ./manage.py loaddata initial_data.json, I got:
django.db.utils.IntegrityError: Problem installing fixture '/home/user/reponame/projectname/initial_data.json': Could not load contenttypes.ContentType(pk=2): UNIQUE constraint failed: django_content_type.app_label, django_content_type.model
What I did to make it work was just rename the pk to id for the contenttypes.contenttype model. After that, the migration worked as expected.
./manage.py loaddata initial_data.json
Installed 2 object(s) from 1 fixture(s)
After the change, my initial_data.json file was:
[
{
"model": "contenttypes.contenttype",
"id": 1,
"fields": {
"app_label": "admin",
"model": "logentry"
}
},
{
"model": "contenttypes.contenttype",
"id": 2,
"fields": {
"app_label": "auth",
"model": "permission"
}
}]
It is worth mentioning that my original initial_dataj.json has many other models, but renaming pk to id only for the contenttypes.contenttype solved my problem.
I had a similar problem. Inspired by this post:
https://github.com/yourlabs/django-cities-light/issues/89 (See 'how to fix it')
before running the loaddata command, I commented the receiver signal decorator before the 'saving function', and it worked.
go the the json file and change evey single 'pk' to 'id'
if you use vs code you can just select 1 and press cmd/ctrl + f2 as a shortcut
Had the same problem while exporting and importing a model with a ManyToMany relation. This was, because I manually speficied the ManyToMany through model while exporting, what caused an unique constraint error.
class MyModel(model.Model):
groups = models.ManyToManyField(
'myapp.mymodel',
)
You only need to execute dumpdata myapp.mymodel, not `dumpdata myapp.mymodel myapp.mymodel_groups"
Otherwise, your through model data is in the export twice, and causes a unique constraint error.
It`s a good question how this behaves, when you specify an explicit through model...i don't know and have no time to test :)
Comment your signals while loading the fixture.

invalid model identifier: 'sites.site'

When I try to run manage.py syncdb, I get this error:
django.core.serializers.base.DeserializationError: Problem installing fixture '/Users/cbplusd/repos/wibo1/fixtures/initial_data.json': Invalid model identifier: 'sites.site'
My installed_apps in my settings.py no longer contains django.contrib.sites, and my .json file looks like this:
[
{
"pk": 1,
"model": "sites.site",
"fields": {
"domain": "localhost:8000",
"name": "wibo"
}
},
{
"pk": 2,
"model": "sites.site",
"fields": {
"domain": "example.com",
"name": "wibo"
}
}
]
Does anyone know what I'm doing wrong?

Categories

Resources