장고에서 단일 쿼리 세트로 레코드를 선택하고 업데이트하는 방법은 무엇입니까?
실행 방법update
그리고.select
같은 내용의 진술queryset
두 가지 쿼리를 수행해야 하는 대신 하나는 개체를 선택하고 다른 하나는 개체를 업데이트합니다.
SQL에 해당하는 것은 다음과 같습니다.
update my_table set field_1 = 'some value' where pk_field = some_value
쿼리 집합 개체 메서드를 사용합니다.
MyModel.objects.filter(pk=some_value).update(field1='some value')
장고 데이터베이스 개체는 개체를 만들고 변경하는 데 동일한 저장() 방법을 사용합니다.
obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()
장고가 업데이트하는 방법과삽입
개체의 기본 키 특성이 True로 평가되는 값(예: 없음 또는 빈 문자열 이외의 값)으로 설정된 경우 Django는 UPDATE를 실행합니다.개체의 기본 키 속성이 설정되지 않았거나 업데이트가 아무것도 업데이트하지 않은 경우 Django는 INSERT를 실행합니다.
참조: https://docs.djangoproject.com/en/1.9/ref/models/instances/
이 답변은 위의 두 가지 접근 방식을 비교합니다.여러 개체를 한 줄로 업데이트하려면 다음 작업을 수행합니다.
# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')
그렇지 않으면 쿼리 세트를 반복하고 개별 개체를 업데이트해야 합니다.
#Approach 2
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
obj.field2 = 'cool'
obj.save()
접근 1은 'n+1'개의 데이터베이스 쿼리를 만드는 접근 2에 비해 하나의 데이터베이스 쿼리만 만들기 때문에 더 빠릅니다. (쿼리 집합의 n개 항목)
첫 번째 접근 방식은 하나의 DB 쿼리를 UPDATE로 만들고, 두 번째 접근 방식은 두 가지를 만듭니다: 선택한 다음 UPDATE.
단점은 업데이트와 같은 트리거가 있다고 가정할 때
updated_on
또는 이러한 관련 필드는 직접 업데이트 접근 1에서 트리거되지 않습니다.접근 1은 쿼리 세트에서 사용되므로 접근 2의 경우가 아닌 여러 개체를 한 번에 업데이트할 수 있습니다.
첫 번째 방법
MyTable.objects.filter(pk=some_value).update(field1='some value')
두 번째 방법
q = MyModel.objects.get(pk=some_value)
q.field1 = 'some value'
q.save()
세 번째 방법
을 사용하여get_object_or_404
q = get_object_or_404(MyModel,pk=some_value)
q.field1 = 'some value'
q.save()
네 번째 방법
필요하다면pk=some_value
그때 존재하는update
그렇지 않으면create
을 사용하여 새것update_or_create
.
MyModel.objects.update_or_create(pk=some_value,defaults={'field1':'some value'})
이전 필드 값을 기준으로 새 값을 설정해야 하는 경우 다음과 같은 작업을 수행합니다.
update my_table set field_1 = field_1 + 1 where pk_field = some_value
MyModel.objects.filter(pk=some_value).update(field1=F('field1') + 1)
이렇게 하면 먼저 읽지 않고 데이터베이스에 대한 하나의 업데이트 요청을 사용하는 업데이트가 자동으로 실행됩니다.
의 경우에만.serializer
당신은 매우 간단한 방법으로 업데이트 할 수 있습니다!
my_model_serializer = MyModelSerializer(
instance=my_model, data=validated_data)
if my_model_serializer.is_valid():
my_model_serializer.save()
의 경우에만.form
물건들!
instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
form.save()
허용된 답변은 효과적이지만 원치 않는 부작용이 있습니다.
예를 들어 imageField를 사용하는 경우 업데이트()는 작동하고 다른 데이터는 업데이트하지만 imageField 데이터는 업데이트하지 않습니다.
class ProfileSetting(models.Model):
first_name = models.CharField(blank=True)
logo = models.ImageField(blank=True, null=True, upload_to="profile/logo/")
update_data = {
"first_name": "john",
"logo": request.FILES['logo'] # logo will not be properly update
}
ProfileSetting.objects.filter(pk=some_value).update(**update_data)
다음은 update() 메서드가 사용될 때 Django ImageField가 업데이트되지 않는 몇 가지 예입니다.
위에서 언급한 답변은 효과적이지만 원치 않는 부작용이 발생하므로 이러한 오류를 방지하기 위해 예외 블록에 DB 코드를 기록합니다.
try:
obj = <Your_Model_Name>.objects.get(PK=<pk_id>)
obj.name = req.POST.get("name")
obj.save()
except Exception as e:
print(e)
언급URL : https://stackoverflow.com/questions/2712682/how-to-select-a-record-and-update-it-with-a-single-queryset-in-django
'programing' 카테고리의 다른 글
JSON_ARRAY가 마리아에 대한 빈 목록을 보내지 않음DB (0) | 2023.08.10 |
---|---|
지원 라이브러리 26.0.0으로 업데이트할 때 지정된 이름과 일치하는 리소스를 찾을 수 없습니다. (0) | 2023.08.10 |
PyCharm 플러그인으로 IntelliJ IDEA에서 Python 인터프리터를 구성하려면 어떻게 해야 합니까? (0) | 2023.08.10 |
SQL Server가 있는 테이블과 관련된 모든 트리거를 찾는 방법은 무엇입니까? (0) | 2023.08.10 |
SQL Server 쿼리에서 정수를 10진수로 변환하는 방법은 무엇입니까? (0) | 2023.08.10 |