Полное внешнее объединение в django

Вас интересует только то, присутствует ли значение пользователя в массиве, но вы проверяете каждое значение, чтобы в конечном итоге найти не более одного правильного ответа и целую кучу неправильных ответов, а также распечатать тонны ненужных сообщений.

Есть несколько способов атаковать это. Например, если вы найдете значение, вы можете установить флаг и выйти из цикла раньше.

bool isFound = false;
for (int index = 0; index < rightanswers.Length; index++)
{
    if (finalAnswer == rightanswers[index])
    {        
        isFound = true;
        break;
    }
}

if (isFound)
    TextValidation.text = "You are correct your answer is :" + finalAnswer;
else
    TextValidation.text = "You are wrong";
delete();

Кроме того, вы можете использовать LINQ, чтобы выяснить, соответствует ли какой-либо из элементов массива искомому значению.

if (rightanswers.Any(x => x == finalAnswer))
    TextValidation.text = "You are correct your answer is :" + finalAnswer;
else
    TextValidation.text = "You are wrong";
delete();
8
задан Ber 31 October 2008 в 11:04
поделиться

2 ответа

Django не поддерживает "соединения" в обычном смысле SQL - он поддерживает объектную навигацию.

Обратите внимание, что реляционное соединение (внутренний или внешний) создает новый "класс" объектов. Тот, который не имеет определения в Django. Таким образом, нет никакого надлежащего "набора результатов", так как нет никакого определения класса для вещей, Вы возвращаетесь. Лучшее, которое можно сделать, определяют кортеж, который будет упакован, Ни один не для недостающих комбинаций.

Левое (или право) внешнее объединение похоже на это. Он создает два непересекающихся подмножества, те, у кого есть связанный набор связанных объектов и те, кто не делает.

for obj in Model1.objects.all():
    if obj.model2_set().count() == 0:
        # process (obj, None) -- no Model2 association
    else:
        for obj2 in obj.model2_set.all():
            # process (obj, obj2) -- the "inner join" result

"Полное" внешнее объединение является объединением остающихся объектов, которые не имеют никаких отношений.

for obj2 in Model2.objects.all():
    if obj2.model1_set().count() == 0:
        # process (None, obj2) -- no Model1 association

Проблема всегда, какую обработку Вы делаете с этим странным набором трех различных подмножеств объектов?

Точка объектной базы данных должна сфокусировать обработку на объекте, и это связало объекты.

Специфический набор звонил, "реляционное соединение" никогда не находится в модели исходного объекта. Это - новый класс объектов, созданных от два (или больше) исходные объекты.

Худшие, внешние объединения создают набор с несколькими подклассами (внутреннее объединение, оставленное внешнее объединение и правильное внешнее объединение). Что означает тот набор вещей?

Ожидайте, это может ухудшиться. Если обработка включает проверки на недостающие атрибуты (т.е. if someObj.anObj2attribute is None: мы по существу ищем Model1 объекты без Model2 объект связан. Ummm..., почему мы помещали тех, которые во внешнем объединении, только для фильтрации их использующий if оператор? Почему не только отдельная AMD запросов обрабатывают каждое подмножество правильно?


Править: При проявлении "неполного" состояния это не внешнее объединение вообще. Это намного более просто. Необходимо создать один (или два) отдельные наборы в функции представления, чтобы шаблон отобразился.

Во-первых, необходимо использовать коды состояния, не присутствие или отсутствие внешнего ключа. Дополнительные внешние ключи не имеют "причин" - они или там или не там. Код состояния может обеспечить полезные оттенки значения ("неполный", "по ошибке", "поврежденный", "не применимый", "чтобы быть удаленным", и т.д.)

errorList1 = Model1.objects.filter( status="Incomplete" )
errorList2 = Model2.objects.filter( status="Incomplete" )

Эти два являются двумя частями несоединения полного внешнего объединения. Можно затем отобразить эти два ошибочных списка в шаблоне с соответствующими заголовками столбцов и кодами состояния и всем.

Можно даже поместить их в единственную таблицу для имитации старого полного внешнего объединения, сообщают, что люди раньше видели

<table>
    <tr><th>Model1</th><th>Model2</th></tr>
    {% for e1 in errorList1 %}
    <tr><td>e1</td><td>NULL</td></tr>
    {% endfor %}
    {% for e2 in errorList2 %}
    <tr><td>NULL</td><td>e2</td></tr>
    {% endfor %}
</table>

Похож на полный отчет о внешнем объединении. Без полного внешнего объединения.

11
ответ дан 5 December 2019 в 14:07
поделиться

Колин, один из парней, с которыми я работаю, недавно написал сообщение о выполнении пользовательских соединений в Django:

http://www.caktusgroup.com/blog/2009/09/28/custom-joins- with-djangos-queryjoin /

Возможно, вы найдете там что-нибудь полезное!

1
ответ дан 5 December 2019 в 14:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: