In Django - Python,
When I tried to create superuser with Django :
Email :
Password :
Password :
" CommandError: La valeur « » doit être soit True (vrai), soit False (faux). "
I can't connect to my Django admin and create a new super user.
I tried :
Alter the file settings.py adding allauth. Not worked.
python manage.py makemigrations and python manage.py migrate. Not worked.
Someone has an idea ?
Related
I have 2 models - Facility and Slot.
class Facility(BaseModel):
name = models.CharField()...
class Slot(BaseModel):
name = models.CharField()...
slot = models.ForeignKey(Facility)
These work perfectly fine.
Now I am adding another model:-
class BlockedSlot(BaseModel):
slots = models.ManyToManyField(Slot)
Now when I run python manage.py makemigrations, it successfully creates a migration file.
But when I run python manage.py migrate, it gives the error - relation "facilities_slot" does not exist.
(models are in facilities.py)
I even tried resetting the db and trying, but it still fails.
I even deleted all the existing migrations and reran makemigrations that generated the 0001_initial.py and again ran migrate, but still fails.
I need to change the relationship of a model field from ForeignKey to ManyToManyField. This comes with a data migration, to update the pre-existing data.
The following is the original model (models.py):
class DealBase(models.Model):
[...]
categoria = models.ForeignKey('Categoria')
[...]
)
I need the model field 'categoria' to establish a many2many relationship with the model 'Categoria' in the app 'deal'.
What I did:
Create a new field 'categoria_tmp' in DealBase
class DealBase(models.Model):
categoria = models.ForeignKey('Categoria')
categoria_tmp = models.ManyToManyField('Categoria',related_name='categoria-temp')
make a schema migration
python manage.py makemigrations
Edit the migrationfile.py to migrate data from categoria to categoria-tmp
def copy_deal_to_dealtmp(apps, schema_editor):
DealBase = apps.get_model('deal', 'DealBase')
for deal in DealBase.objects.all():
deal.categoria_tmp.add(deal.categoria)
deal.save()
class Migration(migrations.Migration):
dependencies = [
('deal', '0017_dealbase_indirizzo'),
]
operations = [
migrations.AddField(
model_name='dealbase',
name='categoria_tmp',
field=models.ManyToManyField(related_name='categoria-temp', to='deal.Categoria'),
preserve_default=True,
),
migrations.RunPython(
copy_deal_to_dealtmp
)
]
make data migration
python manage.py migrate
Finally I need to delete the column 'dealbase.categoria' and rename the column 'dealbase.categoria-tmp' to 'dealbase.categoria'
I'm stuck at step 5.
Could someone help me out? I cannot find online an answer, I'm using Django 1.8.
Thanks!
You just need to create two additional migrations: one to remove the old field and the other to alter the new field.
First remove dealbase.categoria and create a migration and then rename dealbase.categoria-tmp to dealbase.categoria and create another migration.
This will delete the first field and then alter the tmp field to the correct name.
Try this, may help you.
Step 1 as yours
python manage.py makemigrations && python manage.py migrate
Open shell
for i in DealBase.objects.all()
i.categoria_tmp.add(i.categoria)
Remove your field categoria
python manage.py makemigrations && python manage.py migrate
Add field
categoria = models.ManyToManyField('Categoria',related_name='categoria-temp')
Then
python manage.py makemigrations && python manage.py migrate
Open shell
for i in DealBase.objects.all():
for j in i.categoria_tmp.all():
i.categoria.add(j)
Remove field categoria_tmp
python manage.py makemigrations && python manage.py migrate
If you don't have any data in this model, just comment on that model, and then run manage.py makemigrations and migrate. Then delete the wrong field and delete the comment code, and make makemigrations and migrate. This also works in Django 2.
My model was
class Author(Page):
dob = models.DateField("Date of birth")
i removed dob field and updated model with:
class Author(Page):
name = models.CharField(max_length = 250)
email = models.EmailField()
Then entered two commands:
python manage.py schemamigration project_name 001_initial--add-field Author.name, Author.email
then this command
python manage.py migrate project_name
you can see attach image : these above commands don't allow me to save changes in models.
Need your assistance!
SOLUTION:
1)Before adding your new field go to command prompt and move to directory where your project or application is . Now write this command before adding fields in models.py file python manage.py schemamigration your_project_or_app_name --initial
2)Now write this command python manage.py migrate your_project_or_app_name --fake 0001 (or whichever migration number it returned - 0001 is you migration number) to set the south database to that state (tables already created).
3)Now go to your models.py file an add your new fields in your models.py file, then in your cmd run this command python manage schemamigration your_project_or_app_name --auto
4)Last step to save changes run this last migrate command python manage.py migrate your_project_or_app_name
Solution Reference :Django & South: Adding new field but DatabaseError occurs "table already exists" by Yuji 'Tomita' Tomita
To output my database to json file I would usually do
python manage.py dumptdata --indent=4 > mydata.json
However upon executing the following two commands to setup south:
python manage.py schemamigration myproj --initial
python manage.py migrate myproj --fake
I noticed that two of my booleans in mytable for an entry were switched from FALSE to TRUE! I see that from my GUI Web Interface interacting with the database however to more closely compare what changed and got corrupted I'd like to compare json to json but with south enabled I can no longer use the above command as it tells me
Not synced (use migrations):
- myproj
My table that had entries affected is below, I could have more affected data that I have not uncovered.
class MyConfig(models.Model):
name = models.CharField(max_length=64)
myConfigName = models.CharField(max_length=64, unique=True)
myA = models.ForeignKey(MyA)
myB = models.ForeignKey(MyB)
myBoolA = models.BooleanField()
myBoolB = models.BooleanField()
myBoolC = models.BooleanField()
class Meta:
unique_together = ('name', 'myA', 'myB')
def __unicode__(self):
return '%s_%s_%s' % (self.myA.name, self.myB.name, self.name)
schemamigration and migrate --fake don't modify the database. Do you have any initial_data fixture that could be reloaded when migrating? See https://docs.djangoproject.com/en/1.3/howto/initial-data/
Try to migrate with:
python manage.py migrate --no-initial-data
see south doc for more info about options
I don't think that either an --initial or a --fake should alter the database at all, so I'm surprised that it would modify data. In terms of why you're getting the "Not synced (use migrations)" error, I think it's likely because you faked the initial migration.
Try un-migrating the --fake and re-applying the initial migration with
python manage.py migrate --fake zero
python manage.py migrate
Then, you should be able to do the dumptdata
Regarding Django Sites module and manage.py syncdb
The Auth module can prompt to ask for default superuser for the admin site, during .\manage.py syncdb. I would like to see similar things happen for the default site domain name. Currently it is example.com, hardcoded unless I use admin web site to change it. I want to change it during syncdb.
I made a small django app that can be plugged in and play. To plug it in:
download it into project directory or into where your project can find.
add, in your settings.py INSTALLED_APPS, "site_default" (the app name) at the end or after "django.contrib.sites" that it depends on.
Run manage.py syncdb
or manage.py createdefaultsite
Screen shot:
(pinax-dev)>manage.py createdefaultsite
Site domain name: mydomain.com
Site display name: My Site!
(pinax-dev)
It comes with a unit test.
To run unit test:
(pinax-dev)>manage.py test site_default
"site_default" is the app name.
Source code:
http://github.com/peiwei/pinax/raw/master/pinax/apps/site_default.tgz
More Screenshot:
(pinax-dev)> manage.py syncdb
Creating table...
You just installed Django's auth system, which means you don't have any superuse
rs defined.
Would you like to create one now? (yes/no): yes
Username: administrator
E-mail address: who#who.com
Password:
Password (again):
Superuser created successfully.
Would you like to change the default site domain name? (yes/no)[default:no]: yes
Site domain name: mydomain.com
Site display name: My Site!
...
Installing index for signup_codes.SignupCode model
Installing index for signup_codes.SignupCodeResult model
You can do this yourself:
Create a management command to prompt for your new site
connect it to the post_syncdb signal
The command will let you set the site conveniently from the command line. Connecting it to the signal will mean you get prompted whenever the sites app is installed. eg:
from django.contrib.sites import models as sites_app
signals.post_syncdb.connect(create_site, sender=sites_app)
When writing the create_site function (signal handler), you can copy the auth module's approach almost exactly:
def create_site(app, created_models, verbosity, **kwargs):
from django.contrib.sites.models import Site
from django.core.management import call_command
if Site in created_models and kwargs.get('interactive', True):
msg = "\nYou just installed Django's sites system, which means you don't have " \
"any sites defined.\nWould you like to create one now? (yes/no): "
confirm = raw_input(msg)
while 1:
if confirm not in ('yes', 'no'):
confirm = raw_input('Please enter either "yes" or "no": ')
continue
if confirm == 'yes':
call_command("createsite", interactive=True)
break
Now you just need to create your management command createsite and you're done. I do wonder why this isn't already in Django though, I hate example.com.
Put all this into a little app and reuse it for every project your do. Bonus points if you post the app somewhere like google code or django's bug tracker.