null이 아닌 필드 'new_field'를 기본값 없이 사용자 프로파일에 추가하려고 합니다.
1시스템을 때문에 단순 명령 Django 1.7을 South로 .python manage.py makemigrations
그러나 다음 오류만 표시됩니다.
You are trying to add a non-nullable field 'new_field' to userprofile without a default;
we can't do that (the database needs something to populate existing rows).
여기 모델들이 있습니다.py:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True)
new_field = models.CharField(max_length=140)
옵션은 무엇입니까?
기본값을 제공해야 합니다.
new_field = models.CharField(max_length=140, default='SOME STRING')
초기 개발 주기에 있고 현재 데이터베이스 데이터에 관심이 없는 경우 데이터베이스 데이터를 제거한 후 마이그레이션할 수 있습니다.그러나 먼저 마이그레이션 dir를 정리하고 테이블에서 해당 행을 제거해야 합니다(django_migrations).
rm your_app/migrations/*
참고: 마이그레이션 폴더에서 __init__.py를 삭제하지 마십시오.
rm db.sqlite3
python manage.py makemigrations
python manage.py migrate
이전에 Django의 Admin 웹 앱에 대한 슈퍼 사용자를 만든 경우 사용자를 다시 만들어야 할 수 있습니다.
한 가지 옵션은 'new_field'의 기본값을 선언하는 것입니다.
new_field = models.CharField(max_length=140, default='DEFAULT VALUE')
다른 옵션은 'new_field'를 null 가능 필드로 선언하는 것입니다.
new_field = models.CharField(max_length=140, null=True)
' 'input을 'new_field 유효한할 수 있습니다. new_field'는 null 입력입니다.그러면 다음을 추가해야 합니다.blank=True
진술 또한:
new_field = models.CharField(max_length=140, blank=True, null=True)
에도.null=True
및/는blank=True
필요한 경우 기본값을 추가할 수 있습니다.
new_field = models.CharField(max_length=140, default='DEFAULT VALUE', blank=True, null=True)
누군가가 다음을 설정하는 경우ForeignKey
기본값을 설정하지 않고 null 가능 필드만 허용할 수 있습니다.
new_field = models.ForeignKey(model, null=True)
데이터베이스에 이미 저장된 데이터가 있는 경우 기본값을 설정할 수도 있습니다.
new_field = models.ForeignKey(model, default=<existing model id here>)
개발 주기가 시작되면 다음과 같은 방법을 사용할 수 있습니다.
해당 모델과 해당 모델의 모든 용도를 제거/설명합니다.마이그레이션을 적용합니다.그러면 해당 모델이 삭제된 후 모델을 다시 추가하고 마이그레이션을 실행하면 새 필드가 추가된 새 모델이 생성됩니다.
내부에 이미 데이터가 있는 테이블에는 참조를 추가할 수 없습니다.
변경:
user = models.OneToOneField(User)
대상:
user = models.OneToOneField(User, default = "")
수행:
python manage.py makemigrations
python manage.py migrate
다시 변경:
user = models.OneToOneField(User)
마이그레이션 다시 수행:
python manage.py makemigrations
python manage.py migrate
가 " 트사이가"보다 수 new_field
또한 비어 있도록 설정해야 합니다.
if if if save에서 논리를 하려면 if if if if 를 사용합니다.new_field
는 "value 있습니다. "value"에서 저장 기능을 재정의하기만 . 당신이 해야 할 일은 당신의 저장 기능을 재정의하는 것입니다.Model
다음과 같이:
class UserProfile(models.Model):
user = models.OneToOneField(User)
website = models.URLField(blank=True, default='DEFAULT VALUE')
new_field = models.CharField(max_length=140, blank=True, default='DEFAULT VALUE')
def save(self, *args, **kwargs):
if not self.new_field:
# Setting the value of new_field with website's value
self.new_field = self.website
# Saving the object with the default save() function
super(UserProfile, self).save(*args, **kwargs)
다음은 기존의 모든 데이터/마이그레이션(ike)을 삭제하거나 두 번의 별도 마이그레이션이 필요하거나 원하지 않는 기본값을 설정하는 등의 문제를 해결할 필요가 없는 해결 방법입니다.다음 단계를 수행합니다.
- 모에새 를추니다합가필드델을 사용하여 에 새 합니다.
null=False
python manage.py makemigrations <app_name> --name <migration_name>
- 새 필드를 다음으로 변경합니다.
null=True
python manage.py makemigrations <app_name>
이 단계에서는 이전에 보지 못했던 옵션을 볼 수 있습니다!옵션 2: "지금은 무시하고 NULL이 있는 기존 행을 직접 처리할 수 있습니다(예: 이전 데이터 마이그레이션에서 NULL 값을 처리하기 위해 RunPython 또는 RunSQL 작업을 추가했기 때문)."- 동을 합니다.
migrations.AlterField
두 번째 마이그레이션에서 첫 번째 마이그레이션으로 작업하고 수동 마이그레이션을 추가하여 관리합니다.NULL
다음과 같은 값(이 단계를 수행하지 않으면 이전과 같은 무결성 오류가 발생함):
def initial_display_names(apps, schema):
Player = apps.get_model('my_app', 'Player')
Player.objects.all().update(display_name='Cool Name')
def reversal(*args):
"""Reversal is NOOP since display_name is simply dropped during reverse"""
class Migration(migrations.Migration):
dependencies = [
('my_app', '0049_foo'),
]
operations = [
migrations.AddField(
model_name='player',
name='display_name',
field=models.CharField(help_text='name as shown in the UI', max_length=256, null=True),
),
migrations.RunPython(initial_display_names, reversal),
migrations.AlterField(
model_name='player',
name='display_name',
field=models.CharField(help_text='name as shown in the UI', max_length=256),
),
]
- 두 번째 마이그레이션을 제거합니다.
python manage.py migrate <app_name>
new_file에 부울 속성 null을 추가합니다.
new_field = models.CharField(max_length=140, null=True)
을 한 후./manage.py syncdb
고치고 으로 DB를 합니다../manage.py makemigrations
그리고../manage.py migrate
이 페이지 https://docs.djangoproject.com/en/1.8/ref/models/fields/ #default에서 DjangoDoc의 메서드를 사용할 수 있습니다.
기본값을 만들고 사용합니다.
def contact_default():
return {"email": "to1@example.com"}
contact_info = JSONField("ContactInfo", default=contact_default)
?UserProfile
새 할 때 수 . 왜냐하면 열이 수 입니다.NULL
따라서 열에서 해당 필드를 설정할 항목을 묻습니다.new_fields
문제를 해결하기 위해 이 테이블의 모든 행을 삭제해야 했습니다.
(이것이 얼마 전에 해결되었다는 것을 알고 있지만, 저는 방금 이 문제에 부딪혔고 이것이 제 해결책이었습니다.바라건대 이것을 보는 새로운 사람에게 도움이 될 것입니다.)
저는 개발 주기의 초기 단계였기 때문에, 이것이 모두에게 효과가 있는 것은 아닐 수도 있습니다(하지만 왜 그렇지 않은지 모르겠습니다).
추가했습니다.blank=True, null=True
오류가 발생한 열로 이동합니다.그리고 나서 저는 실행했습니다.python manage.py makemigrations
명령어
명령을 및 실행 전)python manage.py migrate
), ), 을blank=True, null=True
모든 칸에서.그때 나는 달렸습니다.python manage.py makemigrations
다시 한 번. 저는 제가 선택한 열을 직접 변경할 수 있는 옵션이 주어졌습니다.
그때 나는 달렸습니다.python manage.py migrate
그리고 모든 것이 잘 작동했습니다!
이 문제를 해결하는 가장 좋은 방법은 필요한 모든 필드와 이름이 약간 다른 다른 다른 모델을 만드는 것입니다.마이그레이션을 실행합니다.사용되지 않는 모델을 삭제하고 마이그레이션을 다시 실행합니다.Voila.
인 문가있모표형잘괜를다라같찮음다은있을 지정할 수 .None
즉석에서마이그레이션에 불필요한 데이터가 포함됩니다.default=None
코드에 기본값이 없습니다.테이블에 더 이상 기본값이 필요한 데이터가 없기 때문에 잘 적용할 수 있습니다.
장고가 실제로 말하는 것은 다음과 같습니다.
table에는 가 있고, userprofile 가 있을 수 .
new_field
하시겠습니까? 하면 할 수 입니다. 그러면 NULL을 가진 값이 있으면 오류가 발생할 수 있기 때문입니다.
없하경의 것이 하다면,userprofile
테이블이 NULL - fall free이고 경고를 무시합니다.
이러한 경우 가장 좋은 방법은 RunPython 마이그레이션을 생성하여 옵션 2에 명시된 빈 값을 처리하는 것입니다.
지금은 무시하고 NULL이 있는 기존 행을 직접 처리할 수 있습니다(예: 이전 데이터 마이그레이션에서 NULL 값을 처리하기 위해 RunPython 또는 RunSQL 작업을 추가했기 때문).
RunPython 마이그레이션에서 모든 것을 찾아야 합니다.UserProfile
인턴이 new_field
값을 지정하고 올바른 값을 입력합니다(또는 Django가 모형에서 설정하도록 요청하는 기본값).다음과 같은 것을 얻을 수 있습니다.
# please keep in mind that new_value can be an empty string. You decide whether it is a correct value.
for profile in UserProfile.objects.filter(new_value__isnull=True).iterator():
profile.new_value = calculate_value(profile)
profile.save() # better to use batch save
재미있게 보내!
models.py 에서
class UserProfile(models.Model): user = models.OneToOneField(User) website = models.URLField(blank=True) new_field = models.CharField(max_length=140, default="some_value")
일부 값을 기본값으로 추가해야 합니다.
기본적으로 저는 이 문제를 해결했습니다.null=True
추가 모형에서.예:
기존 데이터베이스 모듈에 phone_number를 추가하려고 했습니다.
phone_number = models.CharField(max_length=10)
이전에 다음 오류가 발생했습니다.
기본값 없이 null이 아닌 필드 'phone_number'를 고객에게 추가하려고 합니다. 이 작업을 수행할 수 없습니다. 데이터베이스에는 기존 행을 채울 무언가가 필요합니다.수정 사항을 선택하십시오.
- 지금 일회성 기본값 제공(이 열의 null 값을 가진 모든 기존 행에 설정됨)
- 종료하고 models.py 에 기본값을 추가합니다.
퍼팅후
phone_number = models.CharField(max_length=10, null=True)
python manage.py makemigrations
Migrations for 'collegekhajagharapp':
collegekhajagharapp\migrations\0002_customer_phone_number.py
- Add field phone_number to customer
모델 삭제 => 마이그레이션 모델 만들기 => 마이그레이션 모델 => 모델 되돌리기 => 마이그레이션 모델 만들기 => 마이그레이션 모델
SSH에 두 가지 옵션이 제공되면 1번을 선택하고 "없음"을 입력합니다.그냥...현재로서는.
새 테이블이지만 데이터에 관심이 없는 경우 다음 단계를 수행합니다.
Delete FROM public.django_migrations where app=<your_app_name>
Delete all migrations file from your project
DROP table <your_table_name>
python manage.py makemigrations
python manage.py migrate
데이터가 중요한 경우 필드에 기본값 추가
new_field = models.CharField(max_length=140, default='your_default_value')
언급URL : https://stackoverflow.com/questions/26185687/you-are-trying-to-add-a-non-nullable-field-new-field-to-userprofile-without-a
'programing' 카테고리의 다른 글
스프링 부트에서 CORS를 활성화하는 방법 - 작동하지 않음 (0) | 2023.07.20 |
---|---|
Truthy와 Falsy는 무엇입니까?참 및 거짓과 어떻게 다릅니까? (0) | 2023.07.20 |
SQL Server의 임시 테이블 범위 (0) | 2023.07.20 |
표준 C/C++에서 파일 구분 기호를 가져오는 방법: / 또는 \? (0) | 2023.07.20 |
이전 값이 적용에서도 계산될 때 Pandas에서 dataframe.apply의 이전 행 값을 사용할 수 있는 방법이 있습니까? (0) | 2023.07.20 |