جانغو:هل يشير Unique_together إلى db_index=True بنفس الطريقة التي يستخدمها ExternalKey؟
-
27-10-2019 - |
سؤال
حقل على نموذج، foo = models.ForeignKey(Foo)
سيضيف تلقائيًا فهرس قاعدة بيانات للعمود، من أجل إجراء عمليات البحث بشكل أسرع.هذا أمر جيد وجيد، لكن مستندات Django لا توضح ما إذا كانت الحقول الموجودة في نموذج التعريف أم لا unique_together
تلقي نفس المعاملة.لقد صادف أن لدي نموذجًا يتم فيه إدراج حقل حرف واحد فيه unique_together
يتطلب فهرسًا لعمليات البحث السريعة.أعلم أنه لن يضر أي شيء لإضافة نسخة مكررة db_index=True
في تعريف المجال، ولكن أنا غريبة.
المحلول
unique_together
لا يقوم تلقائيًا بإضافة فهارس لكل حقل مدرج في القائمة.
تقترح الإصدارات الجديدة من Django استخدام خيارات تعريف الفهرس والقيود بدلاً من ذلك:
https://docs.djangoproject.com/en/2.2/ref/models/options/#unique-together
https://docs.djangoproject.com/en/2.2/ref/models/options/#index-together
نصائح أخرى
لأي شخص يأتي إلى هنا ويتساءل عما إذا كانوا بحاجة إلى index_together
بالإضافة إلى unique_together
للحصول على فائدة أداء الفهرس، فإن إجابة Postgres هي لا, ، هم وظيفيا نفسه.
لو unique_together
إذا قمت بإضافة فهرس، فسيكون فهرسًا متعدد الأعمدة.
إذا كنت تريد فهرسة أحد الأعمدة بشكل فردي، فأعتقد أنك بحاجة إلى التحديد db_index=True
في تعريف المجال
في جانغو 1.5 وما فوق, ، يمكنك استخدام ال {Model}.Meta.index_together
سمة الطبقة.إذا كان لديك حقلين مسمى foo
و bar
, ، ستضيف:
class Meta(object):
index_together = unique_together = [
['foo', 'bar']
]
إذا كان لديك مجموعة واحدة فقط من الحقول الفريدة، فيمكنك استخدام حقل قابل للتكرار أحادي البعد لـ unique_together
.لكن، وثائق لا يشير إلى أن الشيء نفسه ينطبق على index_together
.
سيكون هذا جيدًا أيضًا:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = [
['foo', 'bar']
]
ومع ذلك، هذا هو لا مدعومة بالوثائق:
class Meta(object):
unique_together = 'foo', 'bar'
index_together = 'foo', 'bar'
وفق المستندات, ، فإنه سيفرض التفرد على مستوى قاعدة البيانات فقط.أعتقد بشكل عام أن جعل الحقل فريدًا لا يعني أنه يحتوي على فهرس.على الرغم من أنه يمكنك أيضًا التحقق من مستوى قاعدة البيانات في حالة وجود الفهرس.كل شيء يشير وإن لم يكن كذلك.