programing

null이 아닌 필드 'new_field'를 기본값 없이 사용자 프로파일에 추가하려고 합니다.

i4 2023. 7. 20. 21:42
반응형

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)을 삭제하거나 두 번의 별도 마이그레이션이 필요하거나 원하지 않는 기본값을 설정하는 등의 문제를 해결할 필요가 없는 해결 방법입니다.다음 단계를 수행합니다.

  1. 모에새 를추니다합가필드델을 사용하여 에 새 합니다.null=False
  2. python manage.py makemigrations <app_name> --name <migration_name>
  3. 새 필드를 다음으로 변경합니다.null=True
  4. python manage.py makemigrations <app_name>이 단계에서는 이전에 보지 못했던 옵션을 볼 수 있습니다!옵션 2: "지금은 무시하고 NULL이 있는 기존 행을 직접 처리할 수 있습니다(예: 이전 데이터 마이그레이션에서 NULL 값을 처리하기 위해 RunPython 또는 RunSQL 작업을 추가했기 때문)."
  5. 동을 합니다.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),
        ),
    ]
  1. 두 번째 마이그레이션을 제거합니다.
  2. 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'를 고객에게 추가하려고 합니다. 이 작업을 수행할 수 없습니다. 데이터베이스에는 기존 행을 채울 무언가가 필요합니다.수정 사항을 선택하십시오.

  1. 지금 일회성 기본값 제공(이 열의 null 값을 가진 모든 기존 행에 설정됨)
  2. 종료하고 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번을 선택하고 "없음"을 입력합니다.그냥...현재로서는.

새 테이블이지만 데이터에 관심이 없는 경우 다음 단계를 수행합니다.

  1. Delete FROM public.django_migrations where app=<your_app_name>
  2. Delete all migrations file from your project
  3. DROP table <your_table_name>
  4. python manage.py makemigrations
  5. 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

반응형