سؤال

ولدي جدول مع IntegerField (hit_count)، وعندما صفحة يزورها (على سبيل المثال، http://site/page/3) أريد ID سجل العمود hit_count 3 في قاعدة البيانات إلى زيادة بمقدار 1.

يجب أن يكون الاستعلام مثل:

update table set hit_count = hit_count + 1 where id = 3

هل يمكنني القيام بذلك مع الاتفاقيات جانغو نموذج القياسية؟ أو ينبغي أن مجرد كتابة الاستعلام عن طريق اليد؟

هل كانت مفيدة؟

المحلول

إذا كنت تستخدم جانغو 1.1+، ومجرد استخدام <لأ href = "http://docs.djangoproject.com/en/dev/topics/db/queries/#filters-can-reference-fields-on-the- نموذج "يختلط =" noreferrer "> تعبيرات F :

from django.db.models import F
...
MyModel.objects.filter(id=...).update(hit_count=F('hit_count')+1)

وهذه سوف تؤدي استعلام قاعدة بيانات الذري واحد.

وكما يقول gerdemb، يجب عليك أن تنظر وضع هذا في الوسيطة لجعلها قابلة لإعادة الاستخدام بسهولة حتى لا فوضى حتى عن وجهات نظركم.


نصائح أخرى

وكما يقول gerdemb، يجب أن تكتب قبل أن تتحول إلى الوسيطة لجعلها قابلة لإعادة الاستخدام حقا. أو (أبسط) إرسال بريد الديكور وظيفة. في الواقع، هناك محولات لاستخدام الوسيطة كما الديكور وبالعكس.

ولكن إذا كنت قلقا حول أداء وتريد أن تبقي الاستعلامات DB في الصفحة ضربت منخفضة، يمكنك استخدام في عملية زيادة الذرية أعطها. وبطبيعة الحال، في هذه الحالة، عليك أن تأخذ الرعاية من استمرار نفسك.

وسوف الاتفاقيات نموذج لا تكون الذري. إرسال باليد:

BEGIN
SELECT * FROM table WHERE id=3 FOR UPDATE
UPDATE table SET hit_count=hit_count+1 WHERE id=3
COMMIT

وأود أن تبدأ من خلال النظر في وثائق <وأ href = "http://docs.djangoproject.com/en/dev/topics/http/middleware/#topics-http-middleware" يختلط = "نوفولو noreferrer" > الوسيطة . تعليق اجناسيو حول عدم وجود صفقات نووية هو الصحيح، ولكن هذا هو وجود مشكلة في إطار جانغو بأكمله. إلا إذا كنت قلقا بشأن وجود عداد دقيقة 100٪ وأود أن لا تقلق بشأن ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top