2013-01-01 45 views
59

Tôi muốn tạo một đối tượng mô hình, như Person, nếu id của người đó không tồn tại hoặc tôi sẽ nhận được đối tượng người đó.Tạo mô hình Django hoặc cập nhật nếu tồn tại

Mã này để tạo ra một con người mới như sau:

class Person(models.Model): 
    identifier = models.CharField(max_length = 10) 
    name = models.CharField(max_length = 20) 
    objects = PersonManager() 

class PersonManager(models.Manager): 
    def create_person(self, identifier): 
     person = self.create(identifier = identifier) 
     return person 

Nhưng tôi không biết được nơi để kiểm tra và nhận được đối tượng người hiện có.

Trả lời

111

Nếu bạn đang tìm kiếm "cập nhật nếu tồn tại khác tạo ra" trường hợp sử dụng, vui lòng tham khảo @Zags excellent answer


Django đã có một get_or_create, https://docs.djangoproject.com/en/1.9/ref/models/querysets/#get-or-create

Đối với bạn nó có thể là:

id = 'some identifier' 
person, created = Person.objects.get_or_create(identifier=id) 

if created: 
    # means you have created a new person 
else: 
    # person just refers to the existing one 
+0

Tôi đang sử dụng django 1.9 và cung cấp cho tôi: Thuộc tínhLỗi: đối tượng 'QuerySet' không có thuộc tính 'update_or_create' –

+0

@OfekGila Thật lạ lùng, cả [source code] (https://github.com/django /django/blob/master/django/db/models/query.py#L475) và [tài liệu] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#update-or- tạo) xác nhận 'QuerySet' có' update_or_create' – bakkal

6

Django có hỗ trợ cho việc này, hãy kiểm tra get_or_create

person, created = Person.objects.get_or_create(name='abc') 
if created: 
    # A new person object created 
else: 
    # person object already exists 
3

Nghĩ rằng tôi muốn thêm câu trả lời vì tựa đề câu hỏi của bạn có vẻ như đang hỏi cách tạo hoặc cập nhật, thay vì nhận hoặc tạo như được mô tả trong nội dung câu hỏi.

Nếu bạn muốn tạo hoặc cập nhật một đối tượng, các lệnh .save() phương pháp đã có hành vi này theo mặc định, từ the docs:

Django abstracts the need to use INSERT or UPDATE SQL statements. Specifically, when you call save(), Django follows this algorithm:

If the object’s primary key attribute is set to a value that evaluates to True (i.e., a value other than None or the empty string), Django executes an UPDATE. If the object’s primary key attribute is not set or if the UPDATE didn’t update anything, Django executes an INSERT.

Nó đáng chú ý là khi họ nói 'nếu didn CẬP NHẬT 't cập nhật bất cứ điều gì' họ chủ yếu đề cập đến trường hợp id bạn đã cung cấp đối tượng không tồn tại trong cơ sở dữ liệu.

73

Không rõ câu hỏi của bạn có yêu cầu phương thức get_or_create (có sẵn từ ít nhất là Django 1.3) hoặc phương pháp update_or_create (mới ở Django 1.7). Nó phụ thuộc vào cách bạn muốn cập nhật đối tượng người dùng.

sử dụng mẫu như sau:

# In both cases, the call will get a person object with matching 
# identifier or create one if none exists; if a person is created, 
# it will be created with name equal to the value in `name`. 

# In this case, if the Person already exists, its existing name is preserved 
person, created = Person.objects.get_or_create(
     identifier=identifier, defaults={"name": name} 
) 

# In this case, if the Person already exists, its name is updated 
person, created = Person.objects.update_or_create(
     identifier=identifier, defaults={"name": name} 
) 
+5

+1 cho 'update_or_create' vì trường hợp sử dụng đó tốt hơn' get_or_create' chỉ để gọi 'save()' trên đối tượng một lần nữa. – bakkal

0

Nếu một trong những đầu vào khi bạn tạo một khóa chính, đây sẽ là đủ:

Person.objects.get_or_create(id=1) 

Nó sẽ tự động cập nhật nếu tồn tại kể từ khi hai dữ liệu có cùng khóa chính không được phép.

Các vấn đề liên quan