جانغو:هل يشير Unique_together إلى db_index=True بنفس الطريقة التي يستخدمها ExternalKey؟

StackOverflow https://stackoverflow.com/questions/7830091

سؤال

حقل على نموذج، 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'

وفق المستندات, ، فإنه سيفرض التفرد على مستوى قاعدة البيانات فقط.أعتقد بشكل عام أن جعل الحقل فريدًا لا يعني أنه يحتوي على فهرس.على الرغم من أنه يمكنك أيضًا التحقق من مستوى قاعدة البيانات في حالة وجود الفهرس.كل شيء يشير وإن لم يكن كذلك.

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